[CF911B]Two Cakes
题目大意:
有两种蛋糕,分别被切成了a块和b块,要把这些蛋糕分到n个盘子里。
要求每个盘子里只能有一种蛋糕,每一种蛋糕都被分。问最优情况下,盘子里至少能放几个蛋糕。
思路:
二分答案。
由于每个蛋糕都要被分,所以二分的上界是min(a,b)而不是a+b。
然后O(n)检验即可。
1 #include<cstdio> 2 #include<cctype> 3 #include<algorithm> 4 inline int getint() { 5 register char ch; 6 while(!isdigit(ch=getchar())); 7 register int x=ch^'0'; 8 while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); 9 return x; 10 } 11 inline bool check(const int &n,int a,int b,const int &m) { 12 for(register int i=1;i<=n;i++) { 13 if(a>=m) { 14 a-=m; 15 continue; 16 } 17 if(b>=m) { 18 b-=m; 19 continue; 20 } 21 return false; 22 } 23 return true; 24 } 25 int main() { 26 const int n=getint(),a=getint(),b=getint(); 27 int l=1,r=std::min(a,b); 28 while(l<=r) { 29 const int mid=(l+r)>>1; 30 if(check(n,a,b,mid)) { 31 l=mid+1; 32 } else { 33 r=mid-1; 34 } 35 } 36 printf("%d\n",l-1); 37 return 0; 38 }