【PA2014】【BZOJ3709】Bohater(贪心,排序)

举报
小哈里 发表于 2022/05/11 00:01:35 2022/05/11
【摘要】 problem 有n只怪打败第i只怪物,消耗d[i]点生命值,恢复a[i]点生命值。任何时候你的生命值都不能降到0(或0以下)请问是否存在一种打怪顺序,使得你可以打完这n只怪物而不死掉n <= 1...

problem

  • 有n只怪
  • 打败第i只怪物,消耗d[i]点生命值,恢复a[i]点生命值。
  • 任何时候你的生命值都不能降到0(或0以下)
  • 请问是否存在一种打怪顺序,使得你可以打完这n只怪物而不死掉
  • n <= 1e5

solution

贪心:
1. 能回血的先杀了, 按d[i]升序防止过程死掉(反正都是加血的,反正最后的血量也是确定的)。
2. 不能回血的按a[i]降序,因为只考虑d我们要扣除的血量是一定的,为了不死显然回血多的放前面更好
3. 当前这一步的可能性也没有减少,即使补血多的耗血很多,但是由于此时血量已经是单减的了,所以若此时无法杀掉耗血多的,将来也不能。

codes

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 100010;
typedef long long LL;  //bugs
struct node{ int d, a, id; }b[maxn], c[maxn];
bool cmp1(node x, node y){ return x.d<y.d; }
bool cmp2(node x, node y){ return x.a>y.a; }
int bn, cn;
int main(){
    LL n, z, i;  cin>>n>>z;
    for(i = 1; i <= n; i++){
        int x, y;  cin>>x>>y;
        if(x <= y){
            ++bn; b[bn].id=i; b[bn].d=x; b[bn].a=y;
        }else{
            ++cn; c[cn].id=i; c[cn].d=x; c[cn].a=y;
        }
    }
    sort(b+1, b+bn+1, cmp1);
    sort(c+1, c+cn+1, cmp2);
    for(i = 1; i <= bn; i++){
        if(b[i].d<z){
            z = z-b[i].d+b[i].a;
        }else { cout<<"NIE\n"; return 0; }
    }
    for(i = 1; i <= cn; i++){
        if(c[i].d<z){
            z = z-c[i].d+c[i].a;
        }else { cout<<"NIE\n"; return 0; }
    }
    cout<<"TAK\n";
    for(i = 1; i <= bn; i++)cout<<b[i].id<<" ";
    for(i = 1; i <= cn; i++)cout<<c[i].id<<" ";
    return 0;
}
  
 
  • 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
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

文章来源: gwj1314.blog.csdn.net,作者:小哈里,版权归原作者所有,如需转载,请联系作者。

原文链接:gwj1314.blog.csdn.net/article/details/80443754

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。