传送门: http://www.lydsy.com/JudgeOnline/problem.php?id=3709
题意: 在一款电脑游戏中,你需要打败
n
只怪物(从
题解: 贪心地想,如果一个怪物
d<a
,那么这种怪物肯定是优先打的,可以补血,其次是
d=a
这种怪打了和没打一样,最后再打
d>a
的,因为会掉血。同样是
d<a
的
d
小的优先打,因为如果连
#include<bits/stdc++.h>
const int N = 1e5 + 10;
template <typename T> void read(T &x) {
x = 0; char c = getchar();
for (; !isdigit(c); c = getchar());
for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
}
struct rec{int d, i, det, num;} a[N];
bool cmp(const rec &a, const rec &b) {
if (a.det > 0) return b.det > 0 ? a.d < b.d : 1;
if (a.det < 0) return b.det < 0 ? a.i > b.i : 0;
if (b.det == 0) return a.d > b.d;
return b.det < 0;
}
int n;
long long z;
bool suc = 1;
int main() {
read(n); read(z);
for (int i = 1; i <= n; i++)
read(a[i].d), read(a[i].i),
a[i].det = a[i].i - a[i].d, a[i].num = i;
std::sort(a + 1, a + n + 1, cmp);
for (int i = 1; suc && i <= n; i++)
suc &= (z -= a[i].d) > 0,
z += a[i].i;
if (!suc) {printf("NIE\n"); return 0;}
printf("TAK\n");
for (int i = 1; i < n; i++)
printf("%d ", a[i].num);
printf("%d\n", a[n].num);
return 0;
}