1. 程式人生 > >2012ACM/ICPC杭州賽區網賽 —— F題

2012ACM/ICPC杭州賽區網賽 —— F題

#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;
}