E. Monster Invaders

题意

游戏里有nnn个关卡,你初始在第一关,第iii关有tit_iti​个小怪,每关都有且仅有一个boss。

小怪的hp为1,boss的hp为2。

你有三种攻击方式:

手枪:花费aaa时间对敌单体造成1伤害。

激光枪:花费bbb时间对敌全体造成1伤害。

AWP:花费ccc时间对敌单体造成2伤害。

(1≤a≤b≤c≤1e9)(1\le a\le b\le c\le1e9)(1≤a≤b≤c≤1e9)

当你一次打不死boss时(即没有用AWP),为了降低仇恨,你必须传送到其他关卡。

传送是在关卡移动的唯一方式,每次传送需要ddd时间,且只能传送到相邻关卡,特别的,从111只能到222,从nnn只能到n−1n-1n−1。

求杀死所有怪物的最小时间。

解析

首先对于每一关只有三种战术:

  1. 手枪干掉所有小怪,分两次打死boss
  2. 激光枪干掉所有小怪然后离开,之后回来用手枪打死boss
  3. 手枪干掉所有小怪,AWP秒了boss

归纳后,发现从某点离开时只有两种状态:boss剩1hp和0hp,其转移代价分别为

min(a∗ti+a,b)min(a*t_i+a,b)min(a∗ti​+a,b)和a∗ti+ca*t_i+ca∗ti​+c,分别记为xix_ixi​和yiy_iyi​。

令fi,jf_{i,j}fi,j​表示在第iii关攻击后,boss剩下jjj点hp的最小时间花费,则有:

//表示(i-1)->(i),(i-1)->(i)->(i-1)->(i)两种情况,其中当i=n时注意结束在n-1位置的情况
f[i][0]=min(f[i-1][0]+y[i],f[i-1][1]+2*d+a+min(x[i]+a,y[i]+(i==n?-d:0)))+d;
//表示(i-1)->(i),(i-1)->(i-2)->(i-1)->(i)两种情况
f[i][1]=min(f[i-1][0],f[i-1][1]+a+2*d)+x[i]+d;

代码

#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
#define GKD ios::sync_with_stdio(false)
using namespace std;
const int N=1000010;
int n;
ll a,b,c,d,t[N],f[N][2],x[N],y[N],ans;
int main()
{GKD;cin>>n>>a>>b>>c>>d;mem(f,0x3f);ans=d*n-d;for(int i=1;i<=n;i++){cin>>t[i];x[i]=min(a*t[i]+a,b),y[i]=a*t[i]+c;i==1&&(f[i][0]=y[i],f[i][1]=x[i]);}for(int i=2;i<=n;i++){f[i][0]=min(f[i-1][0]+y[i],f[i-1][1]+2*d+a+min(x[i]+a,y[i]+(i==n?-d:0)))+d;f[i][1]=min(f[i-1][0],f[i-1][1]+a+2*d)+x[i]+d;}ans=f[n][0];cout<<ans;
}

Codeforces Round #666(Div. 2)E. Monster Invaders(DP)相关推荐

  1. Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)切题报告(A-B题)

    这是我第二次参加CF比赛,也是第一次写博客,写得不好,望各位大佬海涵. A. Single Wildcard Pattern Matching 原题链接 这道题,这是难到让人无法直视,太水了. 题目大 ...

  2. [区间记忆化dp入门][Bribe the Prisoners SPOJ - GCJ1C09C][Codeforces Round #505D (rated, Div. 1 + Div. 2, ba]

    Bribe the Prisoners SPOJ - GCJ1C09C 作为这类题代表,f[i][j]代表第i点到第j点单独处理的最值 这题关键:释放某个囚犯后,就把囚犯分成两段,两段互相独立 这类d ...

  3. Codeforces Round #666 (Div. 1) ABCD(E)题解

    目录 比赛记录: A B C D Solution 1 Solution 2 Solution 3 Solution 4 E(目前不太会,正在尝试) 比赛记录: 00:00:00 Participan ...

  4. 【牛客 - 370B】Rinne Loves Graph(分层图最短路 或 最短路dp)

    题干: Island 发生了一场暴乱!现在 Rinne 要和 Setsuna 立马到地上世界去. 众所周知:Island 是有一些奇怪的城镇和道路构成的(题目需要,游戏党勿喷),有些城镇之间用双向道路 ...

  5. 程序员面试金典 - 面试题 17.24. 最大子矩阵(转成一维最大子序和 DP)

    文章目录 1. 题目 2. 解题 2.1 前缀和(超时) 2.2 动态规划 1. 题目 给定一个正整数和负整数组成的 N × M 矩阵,编写代码找出元素总和最大的子矩阵. 返回一个数组 [r1, c1 ...

  6. Codeforces Round #666 (Div. 2)D. Stoned Game(博弈问题)

    problem T和HL玩游戏,n堆石头,玩家轮流在石堆中选择一个(但不能是上一个人取的那堆)取一个石子 一旦有一方不能取石头则判输 solution 统计所有石头数,如果总数小于mx(最多石头的一堆 ...

  7. Codeforces Round #666 (Div. 2)C - Multiples of Length(错位相减)

    problem 给出N个数,可以进行三次操作, 每次选中一个区间,区间里任意一个元素可以加上一个区间长度的倍数(并且加的数可以互相不同) 让所有数变成0 求方案 solution 好久没打CF了,签到 ...

  8. Codeforces Round #666 (Div. 2)B. Power Sequence(等比数列)

    problem 给出一个数列 两个操作 交换位置或者+1 -1 使数列成为首项为1的等比 求最少操作次数 solution 考虑到等比数列一定递增,直接排序 (过渡)试想特殊情况,排序后如果知道公比, ...

  9. B. Power Sequence(数学+枚举)Codeforces Round #666 (Div. 2)

    原题链接: https://codeforces.com/contest/1397/problem/B 测试样例: input 3 1 3 2 output 1 input 3 1000000000 ...

最新文章

  1. websockets_如何将WebSockets与AWS API Gateway和Lambda一起使用来构建实时应用程序
  2. Robot Framework + Selenium library + IEDriver环境搭建
  3. Bootstrap学习(二)
  4. 腾讯网易禁止未成年人本周六玩游戏
  5. 毕业后拉开距离的真正原因!
  6. iframe 滚动条不显示_BUG赏金 | 当我发现iFrame注入时的利用
  7. BZOJ4003: [JLOI2015]城池攻占
  8. java入门第二季--封装--java中的this
  9. 远程医疗作用_是远程医疗保健的未来
  10. C语言经典算法实例5:验证哥德巴赫猜想
  11. 全面解析Sbo业务审批流程与结构
  12. 路线规划算法设计要点
  13. aardio - 【开源软件】aardio文件加解密
  14. 【渝粤教育】电大中专中医基础知识 作业 题库
  15. 解决EZP_XPro无法烧录
  16. Python自动化操作Excel绘制条形图!
  17. Python3中正则表达式使用方法
  18. linux防火墙关闭与启动命令
  19. qt控制程序打开记事本_基于QT记事本应用程序开发.doc
  20. 商城后台管理React+Springboot

热门文章

  1. 伯克利的电气工程和计算机科学专业,Berkeley的Electrical Engineering Computer Sciences「加州大学伯克利分校电气工程与计算机科学系」...
  2. Vue标准后台界面及登录功能流程(2)
  3. iOS开发系列--IOS程序开发概览ios基础
  4. Unable to negotiate with 120.26.106.212 port 22: no matching host key type f
  5. 用c语言写复化梯形积分公式,第六章 函数和宏定义实验(2)
  6. 基于SAS对美国新冠数据的分析
  7. win10英语语言包
  8. 元宇宙中的手势交互(四)第一款主流VR头显中的手势交互原理剖析(Meta Quest 2)
  9. 翻译:确认中的处理控制(CO1P)
  10. Python实现 文本进度条展示(嵩天老师)