1. 程式人生 > >bzoj1816: [Cqoi2010]撲克牌(二分答案判斷)

bzoj1816: [Cqoi2010]撲克牌(二分答案判斷)

blank ali ref cst class zoj AC gpo CQ

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 }

bzoj1816: [Cqoi2010]撲克牌(二分答案判斷)