挺套路的一个题目.问最小的问题,一般就二分一下,且这个单调性真的显然.然后我们注意k只有2e5,完全可以贪心检测,1min..1min的检测嘛,贪心的策略就是ck时间,把我所坚持时间小的优先充电.貌似就么了..
代码如下:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+5; ll a[N]; int n,k,b[N]; struct vv{ ll p; int id; ll a1; int b1; friend bool operator<(struct vv x,struct vv y) { if(x.p==y.p) return x.id<y.id; else return x.p>y.p; } }; priority_queue<vv>q; priority_queue<vv>q2; bool ck(ll x) { q2=q; for(int i=1;i<=k;i++) { auto temp=q2.top(); if(1ll*temp.b1*1ll*(i-1)>temp.a1) return false; temp.a1+=x; q2.pop(); q2.push({temp.a1/(1ll*temp.b1),i,temp.a1,temp.b1}); } return true; } int main() { scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) scanf("%lld",&a[i]); for(int i=1;i<=n;i++) scanf("%d",&b[i]); for(int i=1;i<=n;i++) { q.push({a[i]/(1ll*b[i]),i,a[i],b[i]}); } ll l=0,r=2e12,ans=2e12; while(l<=r) { ll mid=(l+r)>>1; if(ck(mid)) { r=mid-1; ans=min(ans,mid); } else l=mid+1; } ans==2e12?puts("-1"):printf("%lld\n",ans); return 0; }
时间很紧...所以emmm