题意:
有n台笔记本电脑,它们有一个初始电量ai,和每分钟耗电量bi,有一场训练需要持续k分钟,在每一分钟开始时电量不能为负,你能使用一个多大功率的充电器使其能完成训练,如果没有,则输出-1.
思路:
二分枚举答案,如果一个超大的功率都不行,则说明没有,输出-1,判断一个功率是否可行,可以记录在该功率时每台笔记本最迟充电时间点并记录,然后判断在时间上是否有冲突即可。
代码:
#include <bits/stdc++.h> typedef long long ll; using namespace std; ll n, k; struct w { ll a, b; }w[200005], w2; ll const inf=10000000000007; int pan[200005]; bool fun(ll d) { int ki=0; for(int i=0;i<n;i++) { w2=w[i]; while(w2.a<(k-1)*w2.b) { pan[min(w2.a/w2.b,k-1)]++; w2.a=w2.a+d; ki++; if(ki>=k) { return 0; } } } int sum=0; for(int i=0;i<=k-1;i++) { sum=sum+pan[i]; if(sum>i+1) { return 0; } } return 1; } int main() { scanf("%lld%lld\n",&n,&k); for(int i=0;i<n;i++) { scanf("%lld",&w[i].a); } for(int i=0;i<n;i++) { scanf("%lld",&w[i].b); } ll l=0, r=inf; while(r-l>1) { ll mid=(l+r)/2; memset(pan,0,sizeof(pan)); if(fun(mid)) { r=mid; } else l=mid; } if(fun(0)) { printf("0\n"); } else if(r==inf) { printf("-1\n"); } else { printf("%lld\n",r); } return 0; }