DP

Problem - E - Codeforces

题意

有个 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 消灭的最短时间

思路

  1. 可以选择攻击的时刻一定是 \(p_1\) 或 \(p_2\) 的倍数,并且每次至少造成 1 点伤害,因此最多有 \(H\) 个需要抉择的时刻 \(T_i\)
  2. 当某时刻两个武器同时发射时,之后的操作就成了一个子问题
  3. 可以设 \(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的更多相关文章

  1. Educational Codeforces Round 137 (Rated for Div. 2) A-F

    比赛链接 A 题解 知识点:数学. \(4\) 位密码,由两个不同的数码组成,一共有 \(C_4^2\) 种方案.从 \(10-n\) 个数字选两个,有 \(C_{10-n}^2\) 种方案.结果为 ...

  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 ...

  3. 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 ...

  4. Educational Codeforces Round 43 (Rated for Div. 2)

    Educational Codeforces Round 43 (Rated for Div. 2) https://codeforces.com/contest/976 A #include< ...

  5. Educational Codeforces Round 35 (Rated for Div. 2)

    Educational Codeforces Round 35 (Rated for Div. 2) https://codeforces.com/contest/911 A 模拟 #include& ...

  6. 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 ...

  7. 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 ...

  8. Educational Codeforces Round 63 (Rated for Div. 2) 题解

    Educational Codeforces Round 63 (Rated for Div. 2)题解 题目链接 A. Reverse a Substring 给出一个字符串,现在可以对这个字符串进 ...

  9. 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 < ...

  10. Educational Codeforces Round 48 (Rated for Div. 2) CD题解

    Educational Codeforces Round 48 (Rated for Div. 2) C. Vasya And The Mushrooms 题目链接:https://codeforce ...

随机推荐

  1. JavaScript:函数:函数的返回值

    调用函数后,总是有返回值的: 使用return关键字进行返回,返回的结果,我们需要用变量来存储; 如果没有使用return语句,或者只有return这一个裸关键字,那么返回的结果是undefined: ...

  2. 【深入浅出 Yarn 架构与实现】4-2 RM 管理 Application Master

    上一篇文章对 ResourceManager 整体架构和功能进行了讲述.本篇将对 RM 中管理 Application Master 的部分进行深入的讲解. 下面将会介绍 RM 与 AM 整体通信执行 ...

  3. 关于RESTful 的使用(实战)

    今天在博客园首页看到一篇关于写 RESTful, 大致就是前端定义的一种规范. 原文如下, https://www.cnblogs.com/zhangmumu/p/11936262.html 看了一圈 ...

  4. [OpenCV实战]40 计算机视觉工具对比

    文章目录 1 简介 2 适用于计算机视觉的MATLAB 2.1 为什么要使用MATLAB进行计算机视觉:优点 2.2 为什么不应该将MATLAB用于计算机视觉:缺点 3 适用于计算机视觉的OpenCV ...

  5. TiDB 底层存储结构 LSM 树原理介绍

    作者:京东物流 刘家存 随着数据量的增大,传统关系型数据库越来越不能满足对于海量数据存储的需求.对于分布式关系型数据库,我们了解其底层存储结构是非常重要的.本文将介绍下分布式关系型数据库 TiDB 所 ...

  6. Java基础篇——JVM初步

    1.JVM的位置 2.JVM体系结构 3.类加载器 虚拟机加载器(java) 启动类(根)加载器(C++) 扩展类加载器(java)↑ 应用程序加载器(java)↑ 4.双亲委派机制 类加载器收到类加 ...

  7. 刷题笔记——1112:C语言考试练习题_一元二次方程

    题目 1112:C语言考试练习题_一元二次方程 代码 import math while True: try: a,b,c=map(float,input().strip().split()) del ...

  8. angular小练习--手写弹出窗口以及文件上传或者复制粘贴,后读取打印文件内容

    实现代码如下 <page-header> <ng-template> </ng-template> </page-header> <div> ...

  9. angular 输入框获取焦点失效的问题

    重点说明: 假如先设定了 输入框disabled又打开,然后执行获取焦点,可能会失效,这个时候可以把getFocus函数放在定时器里,1秒钟后执行,就可以了哦~ 具体代码如下 html         ...

  10. SOFAJRaft源码阅读-Netty时间轮算法的实践

    SOFAJRaft的定时任务调度器是基于Netty来实现的,所以本文将会基于Netty时间轮算法,然后再结合SOFAJRaft源码进行分析. @Author:Akai-yuan @更新时间:2023/ ...