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\n",ans); 38 return 0; 39 }