按照加减血量排序,杀完能加血的放在前面,但有个地方要注意,就是如果两个怪物杀死都能加血的话,要把减少血量少的放在前面
#includeusing namespace std;const int MAXN = 1e5+7;struct Data{ int x, y, ord; inline bool operator < (const Data & rhs) const { int a = y - x, b = rhs.y - rhs.x; if (a >= 0 && b >= 0) return x < rhs.x; if (a * b <= 0) return a >= 0; return y > rhs.y; }}b[MAXN];int n;long long m;int main(void) { scanf("%d%lld", &n, &m); for(int i = 1; i <= n; ++i) { scanf("%d%d", &b[i].x, &b[i].y); b[i].ord = i; } sort(b+1, b+1+n); for(int i = 1; i <= n; ++i) { m -= b[i].x; if (m <= 0) return puts("NIE"), 0; m += b[i].y; } puts("TAK"); for(int i = 1; i <= n; ++i) printf("%d ", b[i].ord); return 0;}