zoukankan      html  css  js  c++  java
  • 【PA2014】【BZOJ3709】Bohater(贪心,排序)

    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
    "; return 0; }
        }
        for(i = 1; i <= cn; i++){
            if(c[i].d<z){
                z = z-c[i].d+c[i].a;
            }else { cout<<"NIE
    "; return 0; }
        }
        cout<<"TAK
    ";
        for(i = 1; i <= bn; i++)cout<<b[i].id<<" ";
        for(i = 1; i <= cn; i++)cout<<c[i].id<<" ";
        return 0;
    }
  • 相关阅读:
    公司的CMS参数
    Kafka 如何保证消息可靠性
    我来了
    spring解决乱码
    mybatis反向工程
    Unicode控制字符
    功能跟进记录
    创建IDataProvider实例
    腾讯2016研发工程师笔试题36车 6跑道 没有计时器 最少要几次取前三
    .net mvc下拉列表DropDownList控件绑定数据
  • 原文地址:https://www.cnblogs.com/gwj1314/p/9444823.html
Copyright © 2011-2022 走看看