2012ACM/ICPC杭州賽區網賽 —— F題
阿新 • • 發佈:2019-02-11
#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; }