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