贪心算法,我们先根据它打败这个怪兽后,是收益还是亏损,分为两个数组,我这里用了一个pair数组,pair数组里面存两个数字,分别为亏损的,和idx(因为最后要输出编号),同时用一个数组存一下每组收益的,然后将pair两个数组排序,收益的数组,按照first从小到大,亏损的,按照从大到小。
```c++
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
typedef long long ll;
typedef pair<ll,ll> pii;
pii b[N],c[N];
ll a[N];
ll cnt1=0,cnt2=0;
ll cmp(pii x,pii y)
{
return x.first>y.first;
}
int main() {
ll n,z;
cin>>n>>z;
for(int i=0; i<n; i++) {
ll x;
cin>>x>>a[i];
if(a[i]>=x) {
b[cnt1++]= {x,i};
} else {
c[cnt2++]= {x,i};
}
}
sort(b,b+cnt1);
sort(c,c+cnt2,cmp);
int flag=0;
for(int i=0; i<cnt1; i++) {
ll x=b[i].first,idx=b[i].second,y=a[idx];
if(z>=x) {
z=z+y-x;
} else {
flag=1;
break;
}
}
if(flag==0) {
for(int i=0; i<cnt2; i++) {
ll x=c[i].first,idx=c[i].second,y=a[idx];
if(z>=x) {
z=z+y-x;
} else {
flag=1;
break;
}
}
}
if(flag==1) {
puts("NIE");
} else {
puts("TAK");
for(int i=0; i<cnt1; i++)
cout<<b[i].second+1<<" ";
for(int i=0; i<cnt2; i++)
cout<<c[i].second+1<<" ";
}
}
/*
3 5
3 1
4 8
8 3
*/
```