BZOJ 3709: [PA2014]Bohater 贪心

本文介绍了一种解决“时空隧道”问题的贪心算法思路,通过合理安排角色的行动顺序来确保生命值始终大于0,从而顺利完成任务。具体策略包括优先选择增加生命值的操作,以及在减少生命值时尽可能选取回血值较高的操作。

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

时空隧道


分析:
这种题基本上都是贪心了…
我们考虑怎样安排才能使得自己不会死掉…QAQ…当然是生命值越大越好…所以为们应该贪心的先使自己的生命值增大再去减小生命值…
所以我们就得到了一个大概的贪心方法…对于每一个怪物记录一个值叫做c=a-d…然后先选c>0的再选c<0的…
那么c>0的应该按照怎样的顺序呢?
还是同样的贪心思想…先选伤害小的…这样能够使得自己死的慢一点…(反正你最后生命值都在增大…所以就要把伤害打的留在后面生命值大的时候去干掉怪物…)
那c<0的时候呢?当然是先选回血值大的…因为反正你都要减小生命值了…那么你就尽可能的让自己回血多一点…
(小环子有一个更机智的解释(QAQ为此她嘲笑了我好久QAQ):
倒着想…就是我们考虑最后一个…因为受的总伤害值是不变的…所以说最后一个回血值是没有用的,那就让他尽量小…机智啊…)


代码如下:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
//by NeighThorn
using namespace std;
//秋兰兮麋芜,罗生兮堂下
const int maxn=100000+5;
int n,stk[maxn]; long long z;
struct M{
    int a,d,c,num;
}s[maxn];
inline bool cmp1(M x,M y){
    return x.c>y.c;
}
inline bool cmp2(M x,M y){
    return x.d<y.d;
}
inline bool cmp3(M x,M y){
    return x.a>y.a;
}
signed main(void){
    scanf("%d%lld",&n,&z);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&s[i].d,&s[i].a),s[i].c=s[i].a-s[i].d,s[i].num=i;
    sort(s+1,s+n+1,cmp1);int id=1;
    for(;id<=n&&s[id].c>0;id++);id--;
    sort(s+1,s+id+1,cmp2);sort(s+id+1,s+n+1,cmp3);
    for(int i=1;i<=n;i++){
        z-=s[i].d;
        if(z<=0) {puts("NIE");return 0;}
        else z+=s[i].a,stk[i]=s[i].num;
    }puts("TAK");
    for(int i=1;i<=n;i++)
        printf("%d ",stk[i]);
    puts("");
    return 0;
}

by >_< NeighThorn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值