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

 

转载于:https://www.cnblogs.com/skylee03/p/8175578.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值