洛谷 1843 奶牛晒衣服
【题解】
二分答案。check的时候如果ai>A*mid,就把sum加上[(ai-A*mid)/B]上取整,最后判断sum是不是小于二分出来的最小时间mid即可。
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #define LL long long 5 #define rg register 6 #define N 500010 7 using namespace std; 8 int n,m,k,a[N],l,r,mid; 9 inline int read(){ 10 int k=0,f=1; char c=getchar(); 11 while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar(); 12 while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar(); 13 return k*f; 14 } 15 inline bool check(){ 16 int sum=0; 17 for(rg int i=1;i<=n;i++)if(a[i]>1ll*m*mid) 18 sum+=(a[i]-m*mid)/k+((a[i]-m*mid)%k?1:0); 19 return sum<=mid; 20 } 21 int main(){ 22 n=read(); m=read(); k=read(); 23 for(rg int i=1;i<=n;i++) a[i]=read(),r=max(r,a[i]); 24 while(l+1<r){ 25 mid=(l+r)>>1; 26 if(check()) r=mid; else l=mid; 27 } 28 printf("%d\n",r); 29 return 0; 30 }