题解:
若d[x]<a[x],杀这个怪是有收益的,可以按d值从小到大杀。
若d[x]>a[x],考虑反过来的过程,如果都杀完后血量是S,那么从后向前就是 S-a[i]+d[i],相当于第一种情况,需要按a值从大到小杀。
分两部分排序模拟即可。
code:
#include<cstdio>
#include<cstring>
#include<algorithm>
//by zrt
//problem:
using namespace std;
int n;long long z;
struct N{
int a,b,id;
}a[100005],b[100005];
int ca,cb;
inline bool cmp(N a,N b){
return a.a<b.a;
}
inline bool cmp2(N a,N b){
return a.b>b.b;
}
int main(){
#ifdef LOCAL
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
scanf("%d%lld",&n,&z);
for(int i=1,x,y;i<=n;i++){
scanf("%d%d",&x,&y);
if(x<y){
a[ca].a=x;a[ca].b=y;a[ca].id=i;
ca++;
}else{
b[cb].a=x;b[cb].b=y;b[cb].id=i;
cb++;
}
}
sort(a,a+ca,cmp);
sort(b,b+cb,cmp2);
bool ok=1;
for(int i=0;i<ca;i++){
if(z<=a[i].a){
ok=0;break;
}else{
z+=a[i].b-a[i].a;
}
}
if(ok)
for(int i=0;i<cb;i++){
if(z<=b[i].a){
ok=0;break;
}else{
z+=b[i].b-b[i].a;
}
}
if(ok){
puts("TAK");
for(int i=0;i<ca;i++){
printf("%d ",a[i].id);
}
for(int i=0;i<cb;i++){
printf("%d ",b[i].id);
}
}else{
puts("NIE");
}
return 0;
}