您的位置:首页 > 其它

3709: [PA2014]Bohater|贪心

2016-03-09 19:10 387 查看
首先显然是先把加血的怪物都干掉,然后再干掉那些减血的怪物

最初的血量是确定的,干掉加血的怪物时可以按照耗血量从小到大的顺序都干掉,这个也比较显然。

然后就是按什么顺序打减血的怪物,因为最终的血量是确定的,所以可以倒过来想,发现和最初的 “干掉加血的怪物时可以按照耗血量从小到大的顺序都干掉”正好相反,也就是对减血的怪物按加血的量从大到小排序挨个打掉

#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
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  贪心