正解:贪心
解题报告:
首先肯定是先打回血>扣血的,因为要保证不死,所以只能打扣血量小于当前血量的怪,又懒得判断打那个不会死,就按照扣血量升序排序就好
然后对剩下的扣血>回血的,感觉就比较难处理顺序了?可以考虑显然最后如果活下来了剩余的血量是已知的,所以考虑倒推,于是就回血扣血功能互换,依然是只要全程血量>0就好,所以就一样地做就好
然后这题就做完辣!
然后我忘记开ll了成功见祖宗,,,太难受了我调了1h+怎么也找不出问题然后数据也看不了darkbzoj还被封了无法get数据,,,自己怎么拍怎么对,,,原地死亡TT
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define ll long long
#define gc getchar()
#define ri register int
#define rc register char
#define rb register bool
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i)
const int N=100000+10;
int n,cnt1,cnt2;
ll hp;
struct nod{int a,b,id;}node1[N],node2[N];
il int read()
{
rc ch=gc;ri x=0;rb y=1;
while(ch!='-' && (ch>'9' || ch<'0'))ch=gc;
if(ch=='-')ch=gc,y=0;
while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),ch=gc;
return y?x:-x;
}
il bool cmp(nod gd,nod gs){return gd.a<gs.a;}
il bool cmq(nod gd,nod gs){return gd.b>gs.b;}
int main()
{
// freopen("3709.in","r",stdin);
// freopen("3709.out","w",stdout);
n=read();hp=read();
rp(i,1,n){ri x=read(),y=read();if(x<=y)node1[++cnt1]=(nod){x,y,i};else node2[++cnt2]=(nod){x,y,i};}
sort(node1+1,node1+1+cnt1,cmp);rp(i,1,cnt1)if(hp<=node1[i].a)return printf("NIE\n"),0;else hp=hp+node1[i].b-node1[i].a;
sort(node2+1,node2+1+cnt2,cmq);rp(i,1,cnt2)if(hp<=node2[i].a)return printf("NIE\n"),0;else hp=hp+node2[i].b-node2[i].a;
printf("TAK\n");rp(i,1,cnt1)printf("%d ",node1[i].id);rp(i,1,cnt2)printf("%d ",node2[i].id);
return 0;
}