1. 程式人生 > >bzoj1816: [Cqoi2010]撲克牌

bzoj1816: [Cqoi2010]撲克牌

inline getchar 撲克牌 題目 std for class ring print

題目鏈接

bzoj1816: [Cqoi2010]撲克牌

題解

還是挺妙的
一套牌只能用一張Joker,那麽貪心是不對的
若能夠組成k套牌,那麽joker一定有種方法在k套牌中出現<=1次
那麽,二分套數,檢驗joker夠不夠用

代碼

/*
還是挺妙的
若能夠組成k套牌,那麽joker一定有種方法在k套牌中出現<=1次 
那麽 
二分套數,檢驗joker夠不夠用
*/
#include<cstdio> 
#include<cstring> 
#include<algorithm> 
inline int read() {
     int x = 0,f = 1;
     char c = getchar(); 
     while ( c < '0' || c > '9')c = getchar(); 
     while(c <= '9' &&c >= '0')x = x*10 + c- '0',c = getchar() ; 
     return x ; 
} 
int n,m;  
int c[79]; 
bool check(int x) { 
    int ned = std::min(x,m); 
    int mx = 0,cmx= 0 ; 
    for(int i = 1;i <= n;++ i) {
        if(c[i] < x) ned -= x - c[i]; 
        if(ned < 0) return false; 
    } 
    return true; 
} 
int main() {  
    n = read(),m = read(); 
    for(int i = 1;i <= n;++ i) c[i] = read(); 
    int l = 0,r = 1000000007; 
    int ans = 0;
    while(l <= r) {
        int mid = l + r >> 1; 
        if(check(mid)){ ans = mid;l = mid + 1; } 
        else r = mid-  1; 
    } 
    printf("%d\n",ans); 
    return 0; 
} 

bzoj1816: [Cqoi2010]撲克牌