题解 P5815 【[CQOI2010]扑克牌】
显然二分 + 贪心;
每次二分一个套牌数目,设它为
我们用一个
第一个是因为最多只有
那为什么这么贪心的放牌是对的呢?因为我们有一个限制条件
假设我们现在紫色的牌只有四张,黑牌代表
下面是代码:
#include <iostream>
#include <cstdio>
#include <cctype>
#define mid ((l + r + 1) >> 1)
using namespace std;
inline long long read() { //快读
long long s = 0, f = 1; char ch;
while(!isdigit(ch = getchar())) (ch == '-') && (f = -f);
for(s = ch ^ 48;isdigit(ch = getchar()); s = (s << 1) + (s << 3) + (ch ^ 48));
return s * f;
}
const int N = 55, inf = 7e8 + 5e7 + 1; //自己瞎试了试
int n, m, l, r;
int c[N];
bool judge(int std) {
int tmp = 0, rest = std;
for(int i = 1;i <= n; i++) {
if(c[i] >= std) continue;
tmp += (std - c[i]); rest -= (std - c[i]); //两个判断条件
if(tmp > m || rest < 0) return 0;
}
return 1;
}
int main() {
n = read(); m = read();
for(int i = 1;i <= n; i++) c[i] = read();
l = 1, r = inf;
while(l < r) { //二分套牌数目
if(judge(mid)) l = mid;
else r = mid - 1;
}
printf("%d", l);
return 0;
}
个人感觉挺好理解的,如果有不对的地方还希望dalao纠正QWQ