bzoj1816: [Cqoi2010]扑克牌(二分答案判断)

1816: [Cqoi2010]扑克牌

题目:传送门 

题解:

   被一道毒瘤题搞残了...弃了坑来刷刷水题

   一开始还想复杂了...结果发现二分水过:

   二分答案...然后check一下,joker肯定尽量用mid次,那么哪种牌不够就补(因为每次只能补一种,所以如果次数用完就return false)

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 int n,m,ans;
 8 int a[1100];
 9 bool check(int x)
10 {
11     int s=min(m,x);
12     for(int i=1;i<=n;i++)
13     {
14         if(a[i]<x)
15         {
16             s=s-(x-a[i]);
17             if(s<0)return false;
18         }
19     }
20     return true;
21 }
22 int main()
23 {
24     scanf("%d%d",&n,&m);
25     for(int i=1;i<=n;i++)scanf("%d",&a[i]);
26     int l=0,r=999999999;ans=0;
27     while(l<=r)
28     {
29         int mid=(l+r)/2;
30         if(check(mid)==true)
31         {
32             l=mid+1;
33             ans=mid;
34         }
35         else r=mid-1;
36     }
37     printf("%d
",ans);
38     return 0;
39 }
原文地址:https://www.cnblogs.com/CHerish_OI/p/8511457.html