3709: [PA2014]Bohater|贪心

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

#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;
}

你可能感兴趣的:(贪心)