【贪心】BZOJ3709 [PA2014]Bohater

题面在这里

显然先打那些\(a>d\)的怪

这些按照\(d\)排序

对于\(d>a\)的怪,考虑打完后的血是一定的,把过程反过来,就是前面的情况了,按照\(a\)排序

示例程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;

const int maxn=100005;
int n;ll z;
struct data{
int d,s,id;
bool operator<(const data&b)const{
if ((d<s)^(b.d<b.s)) return d<s;
if (d<s) return d<b.d;
return s>b.s;
}
}a[maxn];
int main(){
scanf("%d%lld",&n,&z);
for (int i=1;i<=n;i++) scanf("%d%d",&a[i].d,&a[i].s),a[i].id=i;
sort(a+1,a+1+n);
for (int i=1;i<=n;i++)
if (z>a[i].d) z+=-a[i].d+a[i].s;
else return puts("NIE"),0;
puts("TAK");
for (int i=1;i<=n;i++) printf("%d ",a[i].id);
return 0;
}