Educational Codeforces Round 137 (Rated for Div. 2) - E. FTL
DP
题意
有个 BOSS 有 \(H\;(1<=H<=5000)\) 血量,\(s\) 点防御
有两种武器可用攻击 BOSS,伤害分别为 \(p_1,p_2\;(s<min(p_1,p_2)<=5000)\), 冷却时间分别为 \(t_1,t_2\;(1<=t_1,t_2<=10^{12})\)
每一时刻如果 cd 好了可以选择攻击,造成 \(p_i-s\) 点伤害;如果两个武器一起攻击可以造成 \(p_1+p_2-s\) 点伤害
0 时刻两个武器都刚进入 cd,求将 BOSS 消灭的最短时间
思路
- 可以选择攻击的时刻一定是 \(p_1\) 或 \(p_2\) 的倍数,并且每次至少造成 1 点伤害,因此最多有 \(H\) 个需要抉择的时刻 \(T_i\)
- 当某时刻两个武器同时发射时,之后的操作就成了一个子问题
- 可以设 \(f[h]\) 为两个武器都刚进入 cd,打掉 h 血的最短时间,枚举 \(T_i\), 作为第一次刻意等待令两个武器同时发射的时刻,求出前 \(T_i\) 时间正常操作(即 cd 好了就放)造成的伤害 \(tot\), \(f[h]=min(f[h],f[h-tot]+T_i)\)
代码
#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long ll;
typedef pair<int, int> PII;
const int N = 5e3 + 10;
int p[3], H, s;
ll t[3], cnt[3];
ll f[N];
vector<ll> vt;
ll lcm(__int128 a, __int128 b)
{
__int128 t = a / __gcd(a, b) * b;
if (t >= (__int128)2e18)
t = 2e18;
return t;
}
void presolve()
{
if (t[1] > t[2])
{
swap(t[1], t[2]);
swap(p[1], p[2]);
}
p[0] = p[1] + p[2] - s;
p[1] -= s, p[2] -= s;
t[0] = lcm(t[1], t[2]);
for (int i = 1; i * p[1] <= H; i++)
vt.push_back(i * t[1]);
for (int i = 1; i * p[2] <= H; i++)
vt.push_back(i * t[2]);
sort(vt.begin(), vt.end());
vt.erase(unique(vt.begin(), vt.end()), vt.end());
}
void solve()
{
memset(f, 0x3f, sizeof f);
f[0] = 0;
for (int h = 1; h <= p[1]; h++)
f[h] = t[1];
for (int h = p[1] + 1; h <= H; h++)
{
for (auto T : vt)
{
if (T % t[0] == 0)
{
cnt[0] = T / t[0];
cnt[1] = T / t[1] - cnt[0];
cnt[2] = T / t[2] - cnt[0];
}
else if (T % t[1] == 0)
{
if (T < t[2])
{
cnt[1] = T / t[1];
cnt[2] = cnt[0] = 0;
}
else
{
cnt[1] = T / t[1];
cnt[2] = T / t[2];
ll TT = (cnt[2] - 1) * t[2];
cnt[0] = TT / t[0] + 1;
cnt[1] -= cnt[0], cnt[2] -= cnt[0];
}
}
else
{
cnt[2] = T / t[2];
cnt[1] = T / t[1];
ll TT = (cnt[1] - 1) * t[1];
cnt[0] = TT / t[0] + 1;
cnt[1] -= cnt[0], cnt[2] -= cnt[0];
}
ll tot = 0;
for (int i = 0; i < 3; i++)
tot += cnt[i] * p[i];
ll now = 0;
if (tot >= h)
now = T;
else
now = T + f[h - tot];
f[h] = min(f[h], now);
}
}
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> p[1] >> t[1] >> p[2] >> t[2] >> H >> s;
presolve();
solve();
ll ans = f[H];
cout << ans << endl;
return 0;
}
Educational Codeforces Round 137 (Rated for Div. 2) - E. FTL的更多相关文章
- Educational Codeforces Round 137 (Rated for Div. 2) A-F
比赛链接 A 题解 知识点:数学. \(4\) 位密码,由两个不同的数码组成,一共有 \(C_4^2\) 种方案.从 \(10-n\) 个数字选两个,有 \(C_{10-n}^2\) 种方案.结果为 ...
- Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship
Problem Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship Time Limit: 2000 mSec P ...
- Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)
Problem Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...
- Educational Codeforces Round 43 (Rated for Div. 2)
Educational Codeforces Round 43 (Rated for Div. 2) https://codeforces.com/contest/976 A #include< ...
- Educational Codeforces Round 35 (Rated for Div. 2)
Educational Codeforces Round 35 (Rated for Div. 2) https://codeforces.com/contest/911 A 模拟 #include& ...
- Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings
Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings 题目连接: http://cod ...
- Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes
Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes 题目连接: http://code ...
- Educational Codeforces Round 63 (Rated for Div. 2) 题解
Educational Codeforces Round 63 (Rated for Div. 2)题解 题目链接 A. Reverse a Substring 给出一个字符串,现在可以对这个字符串进 ...
- Educational Codeforces Round 39 (Rated for Div. 2) G
Educational Codeforces Round 39 (Rated for Div. 2) G 题意: 给一个序列\(a_i(1 <= a_i <= 10^{9}),2 < ...
- Educational Codeforces Round 48 (Rated for Div. 2) CD题解
Educational Codeforces Round 48 (Rated for Div. 2) C. Vasya And The Mushrooms 题目链接:https://codeforce ...
随机推荐
- 解决MVVMLight导航VM不重置问题
问题阐述:使用MVVMLight导航发现导航后VM里面的数据并未进行重置,需要界面跳转后,历史VM也进行销毁重置,并释放 解决办法: 方法一:在当前界面进行Unloaded进行VM注销并进行重新注入代 ...
- kali安装拼音输入法
前言 最近使用kali感觉没个中文输入法的很不方便,于是决定装个ibus的拼音输入法 安装方法 1.安装ibus 使用命令apt install ibus ibus-pinyin,注意使用root权限 ...
- 绿色版MySQL8.0.26安装流程
下载 5.7 8.0 官网 https://dev.mysql.com/downloads/mysql/ 国内镜像网站 https://developer.aliyun.com/mirror/ ...
- BZOJ4919 大根堆(树形dp+线段树合并)
用 multiset 启发式合并贪心维护 LIS 的做法就不多说了,网上题解一大堆,着重讲一下线段树合并维护 \(dp\). \(O(n^2)\) 的 \(dp\) 非常显然.离散化后,设 \(dp[ ...
- (数据科学学习手札148)geopandas直接支持gdb文件写出与追加
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,在我之前的某篇文章中为大家介绍 ...
- .Net 6 使用 Consul 实现服务注册与发现 看这篇就够了
前言 在这几年的工作中,也经历过几个微服务项目,大多数都上了k8s,基本上都看不到Consul的身影,所以在工作之余折腾了下Consul,作为个人来讲还是得学习下,所以也就顺便通过文章来记录下学习过程 ...
- centos搭建neo4j环境(含java)2021_12
限centos neo4j与java下载: 链接:https://pan.baidu.com/s/1ei15dROGy3OwJfbislxH7g 提取码:8B3A 下载后 1.在linux中建立文 ...
- 小白从零到AIoT之路(前言)
什么是AIoT 简单来说就是AI(人工智能)+IoT(物联网)= AIoT(人工智能物联网). AIoT融合AI技术和IoT技术,通过物联网产生.收集来自不同维度的.海量的数据存储于云端.边缘端,再通 ...
- STM32F4寄存器初始化系列:GPIO
1 static void GPIO_Init(void) 2 { 3 4 //sound 5 GPIO_Set(GPIOB,PIN4,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO ...
- 2021级《JAVA语言程序设计》上机考试试题10
教学副院长功能页 <%@ page language="java" contentType="text/html; charset=UTF-8" page ...