[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 }

 

posted @ 2018-01-02 07:53  skylee03  阅读(182)  评论(0编辑  收藏  举报