CF1141E Superhero Battle

题目大意

有一个有着$h$点血量的boss,
你的每一个回合有$n$种攻击

第$i$种攻击可以对boss造成$-d[i]$的伤害($h=h+d[i]$)

求最早在什么时候能击败boss(即boss血量$\leq0$)

题解

首先我们发现,回合数越少越好(废话)

怎么让回合数最小呢?

我们发现,让boss剩下最多(但是在一个回合内能够击杀)的血量时回合数最少

然后就没有然后了。。。

把boss的血量压到一个回合能击杀的范围内然后枚举即可

具体见代码(注意开long long!)

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <bits/stdc++.h>
#define R register
#define ll long long
#define cmin(a, b) ((a < b) ? a : b)
#define cmax(a, b) ((a < b) ? b : a)
const int MaxN = 2e5 + 10;
typedef std::pair<int, int> pa;
ll h, n;
ll d[MaxN], sum[MaxN];
int main()
{
scanf("%lld%lld", &h, &n);
for (int i = 1; i <= n; i++)
scanf("%lld", &d[i]), sum[i] = sum[i - 1] + d[i];
for (int i = 1; i <= n; i++)
if (h + sum[i] <= 0)
return 0 * printf("%d\n", i);
if (sum[n] >= 0)
return 0 * printf("-1");
ll min = *std::min_element(sum + 1, sum + n + 1);
ll cnt = (h + min - 1) / (-sum[n]) + 1;
h += cnt * sum[n];
for (int i = 1; i <= n; i++)
if (h + sum[i] <= 0)
return 0 * printf("%lld\n", i + cnt * n);
return 0;
}
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×