3709: [PA2014]Bohater|贪心

本文探讨了如何通过排序算法高效地管理怪物的血量,先清除增加血量的怪物,再按照减血量的大小逆序清除,确保战斗胜利。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值