题面

CF1396C Monster Invaders

有 \(n\) 层关卡,每层有 \(a_i\) 个小怪(\(1\) 血)和 \(1\) 个老怪(\(2\) 血)。有三种武器:\(1\) 武器每次攻击耗时 \(r_1\),可以攻击一个怪 \(1\) 血;\(2\) 武器每次攻击耗时 \(r_2\),可以攻击一层每个怪 \(1\) 血;\(3\) 武器每次攻击耗时 \(r_3\),可以杀死一个怪。当一次攻击伤害了老怪但是没有杀死他时,玩家会被迫移动至相邻的层;也可以主动移至相邻的层。刚开始时在 \(1\) 层,每次移动耗时 \(d\),求最后杀死所有怪的最少耗时(不一定要在 \(n\) 层结束)。

数据范围:\(2\le n\le 10^6\),\(1\le r_1\le r_2\le r_3\le 10^9\),\(1\le d\le 10^9\),\(1\le a_i\le 10^6\)。


蒟蒻语

开学前最后一场比赛因为这题卡住了掉回了 CM,真是悲伤。当时少看了 \(r_1\le r_2\le r_3\) 这个条件,AC 后才看到(所以即使没有这个条件蒟蒻的代码可能也可以 AC)。于是彻底失败的蒟蒻决定卧薪尝胆,做了这题写题解。


蒟蒻解

首先很明显,打每一层都有两种打法:

  • 分次打,先用 \(2\) 或 \(1\) 把 boss 打残,把小兵都打死,然后到时候回来补一刀(用 \(1\))。
\[st_i=\min(r_2,r_1(a_i+1))+r_1
\]
  • 一次打掉,用 \(1\) 把 \(a_i\) 个依次打掉,然后用 \(3\) 把 boss 干掉。
\[pa_i=r_1a_i+r_3
\]

除了 \(st_i\) 和 \(pa_i\),剩下可以对答案产生贡献的就是如何走位(\(d\) 的贡献)。

假设每个每层如何打已经决定好,且下文中的分界点一定,可以证明如下走位最优:

对于某个分界点后一段选 \(st\) 的,可以到达终点后回来打完(详见样例 \(\#1\) 解释)。

对于分界点前一段的,从 \(1\) 出发:

对于每两个相邻的选 \(st\) 的层对 \(a,b\),走 \(a\to b\to a\to b\) 的途中将两层打完;

对于多余的选 \(st\) 的层 \(i\),走 \(i\to i\pm 1\to i\)。

对于选 \(pa\) 的,直接走过就可以。

放个抽象一点的图:

比如样例 \(\#2\):

打法选择:\([pa,pa,st,st]=6+6+6+8\)。

走位选择:\(1\to 2\to 1\to 2\to 3\to 4=5\)。

所以答案是 \(6+6+6+8+5=31\)。

所以可以先 dp 出以第 \(n\) 层为终点的前 \(i\) 层的最少打法 \(+\) 走位耗时,然后枚举分界点,两边答案加起来取最小值。


代码

#include <bits/stdc++.h>
using namespace std; //Start
typedef long long ll;
typedef double db;
#define mp(a,b) make_pair((a),(b))
#define x first
#define y second
#define be(a) (a).begin()
#define en(a) (a).end()
#define sz(a) int((a).size())
#define pb(a) push_back(a)
#define R(i,a,b) for(int i=(a),I=(b);i<I;i++)
#define L(i,a,b) for(int i=(a),I=(b);i>I;i--)
const int iinf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f; //Main
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
ll n,r1,r2,r3,d,ans=linf;
cin>>n>>r1>>r2>>r3>>d;
vector<ll> a(n),pa(n),st(n);
R(i,0,n) cin>>a[i],pa[i]=r1*a[i]+r3,st[i]=min(r2,r1*(a[i]+1))+min(min(r1,r2),r3);
vector<ll> f(n+1,linf),g(n+1); f[0]=d*(n-1);
R(i,0,n){
f[i+1]=min(f[i+1],f[i]+pa[i]);
f[i+1]=min(f[i+1],f[i]+st[i]+d*2);
if(i+1<n) f[i+2]=min(f[i+2],f[i]+st[i]+st[i+1]+d*2);
}
ans=min(ans,f[n]);
L(i,n-2,-1) g[i]=g[i+1]+min(pa[i],st[i]);
R(i,0,n-1){
ans=min(ans,f[i]+g[i]+d*(n-1-i)+pa[n-1]);
ans=min(ans,f[i]+g[i]+d*(n-1-i)+d*2+st[n-1]);
}
cout<<ans<<'\n';
return 0;
}

祝大家学习愉快!

题解-CF1396C Monster Invaders的更多相关文章

  1. 「题解」小 R 打怪兽 monster

    本文将同步发布于: 洛谷博客: csdn: 博客园: 简书. 题目 题目描述 小 R 最近在玩一款游戏.在游戏中,小 R 要依次打 \(n\) 个怪兽,他需要打败至少 \(k\) 个怪兽才能通关.小 ...

  2. hdu4950 Monster (水题)

    4950 Monster Monster Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...

  3. HDU 4950 Monster (水题)

    Monster 题目链接: http://acm.hust.edu.cn/vjudge/contest/123554#problem/I Description Teacher Mai has a k ...

  4. Codeforces Round #278 (Div. 1) A. Fight the Monster 暴力

    A. Fight the Monster Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/487/ ...

  5. Codeforces Round #328 (Div. 2) B. The Monster and the Squirrel 打表数学

    B. The Monster and the Squirrel Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/c ...

  6. 2017 google Round C APAC Test 题解

    题解参考网上的答案,以及我自己的想法. 主要参考网站:http://codeforces.com/blog/entry/47181,http://codeforces.com/blog/entry/4 ...

  7. 3856: Monster

    3856: Monster Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 351  Solved: 161[Submit][Status][Discuss ...

  8. HDU暑假多校第三场H.Monster Hunter

    一.题意 给定一个树状地图,每个树节点上有一只怪物,打死一只怪物的过程中将会消耗A点HP,打死之后将会获得B点HP.因为树状结构,所以每只怪物必须先打死父节点的怪兽之后在打死子节点的怪物.现在,给定每 ...

  9. 【bzoj3856】Monster 乱搞

    题目描述 你要打一只h点血的怪物,每回合你攻击会造成a点伤害,回合结束后怪物会回b点血,你每攻击k回合需要休息一次,该回合不能造成伤害.怪物血量降到0以下就会死亡,问最后能否打死怪物. 输入 Ther ...

随机推荐

  1. IO复用之poll

    主要用一个例程来讲解poll,包含客户端和服务器端. poll函数没有FD_SETSIZE的限制 int poll(struct pollfd * fdarray, unsigned long nfd ...

  2. 如何剔掉 sql 语句中的尾巴,我用 C# 苦思了五种办法

    一:背景 1. 讲故事 这几天都在修复bug真的太忙了,期间也遇到了一个挺有趣bug,和大家分享一下,这是一块sql挺复杂的报表相关业务,不知道哪一位大佬在错综复杂的 嵌套 + 平行 if判断中sql ...

  3. [原题复现]2018HCTF WEB admin(session伪造、unicode漏洞、条件竞争)

    简介  原题复现:https://github.com/woadsl1234/HCTF2018_admin  考察知识点:session伪造.unicode漏洞.条件竞争  线上平台:https:// ...

  4. 前后端分离中,使用swagger2和WireMock提高开发速度

    一.使用swagger2生成接口文档 依赖 <dependency> <groupId>io.springfox</groupId> <artifactId& ...

  5. ABBYY FineReader 15 中保存和导出PDF文档的小细节

    运用ABBYY FineReader OCR文字识别软件,用户能将各种格式的PDF文档保存为新的PDF文档.PDF/A格式文档,以及Microsoft Word.Excel.PPT等格式.在保存与导出 ...

  6. 思维导图软件iMindMap:生活工作的好帮手

    思维导图iMindMap这样的好帮手在生活工作中能帮你打破困境,,至于它有哪些力所能及的事情就是下面小编要跟你讲的: 你是否经常遇到过这样的情况: 作为学生,你觉得学习紧张,虽然三更眠五更起,还是成绩 ...

  7. python计算时间差

    前言 之前写代码都是看打印的初始和结束时间然后自己算间隔时间,感觉总是不方便,这不符合python的优雅简洁,于是去寻找简便之道. 方法 time模块计算时间差 import time s_time ...

  8. mycat分片及主从(二)

    一.mycat分片规则 经过上一篇幅讲解,应该很清楚分片规则配置文件rule.xml位于$MYCAT_HOME/conf目录,它定义了所有拆分表的规则.在使用过程中可以灵活使用不同的分片算法,或者对同 ...

  9. CSUST 第15届 校赛总结

    一直想记录一下自己的比赛,却感觉空间说说有点不适,思考了一番还是打算放到自己的博客园 这次比赛总体来说还是不错,签到还是稳的一批,基本前四小时都在rk1 开局切了几道签到题,然后开了一道思维gcd,正 ...

  10. 容器中实现拉取其它服务器的jar包程序

    缘由:在做接口自动化测试时,若业务场景有一个前置仓库,在该仓库内完成一系列的场景测试,一旦某一场景测试失败,脏数据对环境造成影响则需要清理: 1.我容器的内核系统为Debian GNU/Linux 1 ...