原本不想写这个解题报告的,觉得贪心的题没有必要写。。。(一直认为CF Div2里的前几题都是毁智商
好吧,像我这种弱菜也就混混div2 唉~)但是后来超哥来找我说这题有很多人的AC代码都有问题。。。。
![](https://i-blog.csdnimg.cn/blog_migrate/38057bdcddc6f7cd5a12dfc2e8e15e58.gif)
然后就慌了。。。然后就决定在此
跪求各位神牛能掐掉我的代码!!!!
话说那数据真水的要命,当我在跟超哥讲我的代码的时候,我们有个地方起争执了,但是,最后我居然发现是我写错了。。。慌了,会不会是题目敲错+解法错误,结果错错得正,然后就A掉了。。。
还有就是那数据真的水的要死,我一个很明显的手误||||。。。只要数据中有一组有刀的人和没刀的人的人数相差有点大,然后最优解不是杀掉所有人,我当时比赛时AC的代码直接就挂掉了。。
说一下想法吧:
分两种情况:
第一种:
一个有刀的人我都不杀,这样贪心求出最优值anc,lefc两个值;
第二种:
我把所有有刀的人都杀掉,这样,剩下没有刀的人怎么办?比赛时,刚开始的想法就是剩下没刀的人按第一种的方法来杀。但是这样肯定是错的了!!!因为我交了好多次都没过- -||
当时就想到了多校时候碰到的一道矮子出坑的题目,所以,我就想能不能让那些杀掉有刀的人的“借来的刀”去替换我用自己的刀去杀那些没有刀的人。这样再贪心一下,就可以了。
当然我的想法不一定是对的 。。。。。至少我觉得可能有点漏洞~因为智商一直被认为是机房里最低。
![](https://i-blog.csdnimg.cn/blog_migrate/676ebda4729556d2ae74a2569eb85a7a.gif)
#include
#include
#include
#include
using namespace std;
#define M 105000
struct node {
int ai, bi;
} pnt[M];
struct Point {
int ai;
} fnt[M];
int len, m;
bool cmp(node x, node y) {
return x.ai < y.ai;
}
bool cfp(Point x, Point y) {
return x.ai < y.ai;
}
int Max(int x, int y) {
if (x < y) return y;
return x;
}
int main() {
int i, cas, n, casno = 0;
scanf("%d", &cas);
while (cas--) {
scanf("%d%d", &n, &m);
int sum = 0, pos = -1, minn = m + 1;
int cnth = 0;
len = 0;
for (i = 0; i < n; i++) {
scanf("%d%d", &pnt[len].ai, &pnt[len].bi);
fnt[i].ai = pnt[len].ai;
sum += pnt[len].bi;
if (pnt[len].bi > 0 && pnt[len].ai < minn) {
minn = pnt[len].ai;
pos = 0;
}
if (pnt[len].bi != 0) {
cnth++;
len--;
}
len++;
}
if (sum > 0) {
sum -= cnth - 1;
}
sort(pnt, pnt + len, cmp);
sort(fnt, fnt + n, cfp);
int anc = 0, lefc, left, ans = 0;
lefc = m;
for (i = 0; i < len; i++) {//do not kill the dao
if (pnt[i].ai <= lefc) {
anc++;
lefc -= pnt[i].ai;
}
}
if (m >= minn) {//kill the dao first
left = m - minn;
ans = n;
for (i = 0; i < len - sum; i++) {
if (left >= fnt[i].ai) {
if (minn == fnt[i].ai) {
minn = -1;
len++;
continue;
}
left -= fnt[i].ai;
} else {
ans--;
}
}
if (ans == anc) {
lefc = Max(left, lefc);
} else {
if (ans > anc) {
anc = ans;
lefc = left;
}
}
}
printf("Case %d: %d %d\n", ++casno, anc, m - lefc);
}
return 0;
}