CodeForces 1397E :Monster Invaders DP

传送门

题目描述

有两种不同类型的怪物和三种不同类型的枪,
一个拥有1点生命的普通怪物。
一个拥有2点生命的boss。
这三种枪是:
手枪,对一个怪物造成1点生命伤害,时间r1
激光枪,对当前等级的所有怪物(包括老板)造成1点伤害,时间r2
AWP,立即杀死任何怪物,时间r3
这些枪最初是不装子弹的,Ziota一次只能装1把枪。
游戏的等级可以被认为是一个数组a1,a2,…,an,其中第i阶段有ai普通怪物和1个boss。由于游戏的性质,Ziota不能在杀死所有ai正常怪物之前使用手枪(第一种枪)或AWP(第三种枪)来射击boss。
如果Ziota伤害了boss但没有立即杀死它,他将被迫从当前关卡移动到任意相邻关卡i−1或者i+1,Ziota也可以随时选择移动到相邻的楼层。相邻层之间的每一次移动都由传送门管理,传送时间为d。
现在给你n个阶段,r1,r2,r3,d和每个阶段的小怪数ai,且r1<=r2<=r3

分析

首先需要理解的是,这里的cd是主动cd而不是被动cd,也就是说他释放这个技能需要这么长的时间而不是我需要等待多长时间才能第二次释放这个技能

每个boss的血量位2,我们可以去用f[n][2]表示每一层,普通怪物被全部清除的情况下,boss的血量为0或1的情况下,所花费的总时间

代码

#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define debug(x) cout<<#x<<":"<<x<<endl;
#define dl(x) printf("%lld\n",x);
#define di(x) printf("%d\n",x);
#define _CRT_SECURE_NO_WARNINGS
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef vector<int> VI;
const int INF = 0x3f3f3f3f;
const int N = 1e6 + 10;
const ll mod= 1000000007;
const double eps = 1e-9;
const double PI = acos(-1);
template<typename T>inline void read(T &a){
    
    char c=getchar();T x=0,f=1;while(!isdigit(c)){
    
    if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){
    
    x=(x<<1)+(x<<3)+c-'0';c=getchar();}a=f*x;}
int gcd(int a,int b){
    
    return (b>0)?gcd(b,a%b):a;}
ll a[N],r1,r2,r3;
ll f[N][2];
ll n,d;

int main(){
    
    
    read(n);read(r1);read(r2);read(r3);read(d);
    for(int i = 1;i <= n;i++) read(a[i]);
    memset(f,0x3f,sizeof f);
    f[1][0] = a[1] * r1 + r3;
    f[1][1] = min(r2,(a[1] + 1) * r1);
    for(ll i = 2;i <= n;i++){
    
    
        f[i][1] = min(f[i - 1][0] + min((a[i] + 1) * r1,r2),f[i - 1][1] + 2 * d + r1 + min((a[i] + 1) * r1,r2)) + d;
        f[i][0] = f[i - 1][0] + a[i] * r1 + r3;
        f[i][0] = min(f[i][0],f[i - 1][1] + 2 * d + a[i] * r1 + r3 + r1);
        f[i][0] = min(f[i][0],f[i - 1][1] + 2 * d + r1 * 2 + min(a[i] * r1 + r1,r2));
        f[i][0] += d;
    }
    ll ans = 0x3f3f3f3f3f3f3f3f;
    ans = min(f[n][0],f[n - 1][1] + 2 * d + r1 + r1 * a[n] + r3);
    dl(ans);
}

/**
*  ┏┓   ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃       ┃
* ┃   ━   ┃ ++ + + +
*  ████━████+
*  ◥██◤ ◥██◤ +
* ┃   ┻   ┃
* ┃       ┃ + +
* ┗━┓   ┏━┛
*   ┃   ┃ + + + +Code is far away from  
*   ┃   ┃ + bug with the animal protecting
*   ┃    ┗━━━┓ 神兽保佑,代码无bug 
*   ┃        ┣┓
*    ┃        ┏┛
*     ┗┓┓┏━┳┓┏┛ + + + +
*    ┃┫┫ ┃┫┫
*    ┗┻┛ ┗┻┛+ + + +
*/


猜你喜欢

转载自blog.csdn.net/tlyzxc/article/details/113886912
今日推荐