题意:
在数组 a[]
生成的循环数组 \(a_{i+kn}=a_i\) 中,求最小的 \(j\) 使得 \(H+\sum_{i=1}^j a_i\le 0\)
思路:
这题很经典。
假设答案是 \(ans=kn+r\ \ (r<n)\),则应使 \(k\) 尽量小。维护一个前缀和最值即可。注意特判
二分找 k 也能过。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 2e5 + 5;
ll H, a[N], n;
signed main()
{
scanf("%lld%lld", &H, &n);
ll maxx = -1e18;
for(int i = 1; i <= n; i++)
{ //为方便,把a变负
scanf("%lld", &a[i]), a[i] = -a[i];
a[i] += a[i-1], maxx = max(maxx, a[i]);
}
if(a[n] <= 0) //特判
{
for(int i = 1; i <= n; i++) if(a[i] >= H)
{
printf("%d", i);
return 0;
}
puts("-1"); return 0; //无解
}
ll k = max(0ll, (ll)ceil(1.0*(H - maxx) / a[n]));
ll ans = k * n, h = k * a[n];
for(int i = 0; i <= n; i++) if(h + a[i] >= H)
{
ans += i; break;
}
printf("%lld", ans);
return 0;
}