题意
有台电脑,每台电脑,他的初始电量为,每分钟消耗电量为 你有一个功率为的充电器,每分钟可以使一台电脑电量增加。
问,至少为多大才能保证在的时间内任意一台电脑电量都不为负
思路
直接二分充电器的功率。那么接下来就考虑如何这个功率值。 考虑使用优先队列,按照还能使用的时间排序,每次贪心的选取可以撑的时间最少的加上的电,然后每当有可以超过的,就直接移出队列,当队列为空时,便为成功,然后继续二分即可.
代码
#include<bits/stdc++.h> #define ll long long const ll N=1e6+5,INF=2e12; using namespace std; ll n,k; ll a[N],b[N],ans=-1; struct node { ll a,b,c; bool operator < (const node &x)const { if(c!=x.c) return c>x.c; if(b!=x.b) return b<x.b; return a>x.a; } }; inline ll read() { register ll x=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();} while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar(); return x*f; } priority_queue<node> Que; bool check(ll x) { while(!Que.empty()) Que.pop(); for(int i=1;i<=n;i++) if(a[i]/b[i]<k) Que.push({a[i],b[i],a[i]/b[i]}); if(Que.empty()) return 1; for(int i=0;i<k;i++) { node t=Que.top(); Que.pop(); if(t.c<i) return 0; if((t.a+x)/t.b<k) Que.push({t.a+x,t.b,(t.a+x)/t.b}); if(Que.empty()) return 1; } return 1; } int main() { n=read();k=read(); for(ll i=1;i<=n;i++) a[i]=read(); for(ll i=1;i<=n;i++) b[i]=read(); ll l=0,r=INF; while(l<=r) { ll mid=(l+r)/2; if(check(mid)) ans=mid,r=mid-1; else l=mid+1; } printf("%lld",ans); return 0; }