首先显然是先把加血的怪物都干掉,然后再干掉那些减血的怪物
最初的血量是确定的,干掉加血的怪物时可以按照耗血量从小到大的顺序都干掉,这个也比较显然。
然后就是按什么顺序打减血的怪物,因为最终的血量是确定的,所以可以倒过来想,发现和最初的 “干掉加血的怪物时可以按照耗血量从小到大的顺序都干掉”正好相反,也就是对减血的怪物按加血的量从大到小排序挨个打掉
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define N 100066
using namespace std;
int sc()
{
int i=0;char c=getchar();
while(c>'9'||c<'0')c=getchar();
while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar();
return i;
}
struct W{int plu,mi,p;}a[N];
long long now,n,flag;
bool cmp(W a,W b)
{
int x=a.plu-a.mi;
int y=b.plu-b.mi;
if(x>=0&&y>=0)return a.mi<b.mi;
else if(x*y<=0)return x>=0;
else return a.plu>b.plu;
}
int main()
{
n=sc(),now=sc();
for(int i=1;i<=n;i++)
a[i].mi=sc(),a[i].plu=sc(),a[i].p=i;
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
{
now-=a[i].mi;
if(now<=0){flag=1;break;}
now+=a[i].plu;
}
if(flag)puts("NIE");
else
{
puts("TAK");
for(int i=1;i<=n;i++) printf("%d ",a[i].p);
}
return 0;
}