[Cqoi2010]扑克牌
Posted on 2015年1月13日 19:29/****************************************\ * Author : ztx * Title : [Cqoi2010]扑克牌 * ALG : 二分 * CMT : * 首先二分答案,设组成的套数为M, * 在判断是否成立时 , 枚举每一个c , 若ci<M , 则用joker补, * 使用的joker必须要小于等于min(m,M) * Time : \****************************************/
/****************************************\ * Author : ztx * Title : [Cqoi2010]扑克牌 * ALG : 二分 * CMT : * 首先二分答案,设组成的套数为M, * 在判断是否成立时 , 枚举每一个c , 若ci<M , 则用joker补, * 使用的joker必须要小于等于min(m,M) * Time : \****************************************/ #include <cstdio> #define maxn 55LL #define maxc 1000000000LL int n , m , i ; int c[maxn] ; int cnt ; inline bool Could(int M) { cnt = 0 ; for (i = 1 ; i <= n ; i ++ ) { if (c[i] < M) cnt += M-c[i] ; if (cnt > M || cnt > m) return false ; } return true ; } int L , R , M ; inline int Bsearch() { L = 0 , R = maxc+1 ; while (R-L > 1) { /* [L , R) */ M = L+(R-L)/2 ; if (Could(M)) L = M ; else R = M ; } return L ; } int main() { // #define READ #ifdef READ freopen(".in" ,"r",stdin ) ; freopen(".out","w",stdout) ; #endif scanf("%d%d", &n , &m ) ; for (i = 1 ; i <= n ; i ++ ) scanf("%d", &c[i] ) ; printf("%d\n", Bsearch() ) ; #ifdef READ fclose(stdin) ; fclose(stdout) ; #else getchar() ; getchar() ; #endif return 0 ; }