题意:
有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;
}

京公网安备 11010502036488号