zoukankan      html  css  js  c++  java
  • 【BZOJ3709】[PA2014]Bohater

    3709: [PA2014]Bohater

    Time Limit: 5 Sec  Memory Limit: 128 MBSec  Special Judge
    Submit: 1093  Solved: 368
    [Submit][Status][Discuss]

    Description

    在一款电脑游戏中,你需要打败n只怪物(从1到n编号)。为了打败第i只怪物,你需要消耗d[i]点生命值,但怪物死后会掉落血药,使你恢复a[i]点生命值。任何时候你的生命值都不能降到0(或0以下)。请问是否存在一种打怪顺序,使得你可以打完这n只怪物而不死掉

    Input

    第一行两个整数n,z(1<=n,z<=100000),分别表示怪物的数量和你的初始生命值。
    接下来n行,每行两个整数d[i],a[i](0<=d[i],a[i]<=100000)

    Output

    第一行为TAK(是)或NIE(否),表示是否存在这样的顺序。
    如果第一行为TAK,则第二行为空格隔开的1~n的排列,表示合法的顺序。如果答案有很多,你可以输出其中任意一个。

    Sample Input

    3 5
    3 1
    4 8
    8 3

    Sample Output

    TAK
    2 3 1

    HINT

     

    Source

    鸣谢Jcvb

    我们考虑打怪顺序 首先先打能加血的怪 于是我们按消耗从小到大排序(这个还是挺好理解的吧)

    然后我们考虑打不加血的怪 由于最后答案是一个确定的数 我们反着看不加血的怪 那么就是我们要放弃打这些怪 不拿血药但是加血 于是求是否可行 这个问题立刻和上边的问题等价了

    于是我们就排两下序就好了

     /*To The End Of The Galaxy*/
    #include<cstdio>
    #include<cstdlib>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<iomanip>
    #include<stack>
    #include<map>
    #include<set>
    #include<cmath>
    #define debug(x) cerr<<#x<<"="<<x<<endl
    #define INF 0x7f7f7f7f
    #define llINF 0x7fffffffffffll
    #define P(x,y) (((x-1)*m)+y)
    using namespace std;
    typedef pair<int,int> pii;
    typedef long long ll;
    inline int init()
    {
        int now=0,ju=1;char c;bool flag=false;
        while(1)
        {
            c=getchar();
            if(c=='-')ju=-1;
            else if(c>='0'&&c<='9')
            {
                now=now*10+c-'0';
                flag=true;
            }
            else if(flag)return now*ju;
        }
    }
    inline long long llinit()
    {
        long long now=0,ju=1;char c;bool flag=false;
        while(1)
        {
            c=getchar();
            if(c=='-')ju=-1;
            else if(c>='0'&&c<='9')
            {
                now=now*10+c-'0';
                flag=true;
            }
            else if(flag)return now*ju;
        }
    }
    struct node
    {
        ll dec,inc;int id;
    }monster[100005],incmonster[100005],decmonster[100005];
    bool upcmp(node a,node b)
    {
        return a.dec<b.dec;
    }
    bool downcmp(node a,node b)
    {
        return a.inc>b.inc;
    }
    ll ans=0;
    int n;
    int main()
    {
        bool flag=true;
        n=init();ans=llinit();
        int a=0,b=0;
        for(int i=1;i<=n;i++)
        {
            monster[i].dec=llinit();
            monster[i].inc=llinit();
            monster[i].id=i;
            if(monster[i].dec-monster[i].inc<=0)
            {
                incmonster[++a]=monster[i];
            }
            else decmonster[++b]=monster[i];
        }
        sort(incmonster+1,incmonster+1+a,upcmp);
        sort(decmonster+1,decmonster+1+b,downcmp);
        for(int i=1;i<=a;i++)
        {
            ans-=incmonster[i].dec;
            if(ans<=0)
            {
                flag=false;
                break;
            }
            ans+=incmonster[i].inc;
        }
        for(int i=1;i<=b;i++)
        {
            ans-=decmonster[i].dec;
            if(ans<=0)
            {
                flag=false;
                break;
            }
            ans+=decmonster[i].inc;
        }
        if(!flag)
        {
            printf("NIE
    ");
        }
        else
        {
            printf("TAK
    ");
            for(int i=1;i<=a;i++)
            {
                printf("%d ",incmonster[i].id);
            }
            for(int i=1;i<=b;i++)
            {
                printf("%d ",decmonster[i].id);
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Python入门学习笔记07(time)
    Python入门学习笔记01(常用数据类型)
    Python入门学习笔记04(生成器与迭代器)
    Python入门学习笔记05(内置函数)
    Python入门学习笔记 序
    Python入门学习笔记03(装饰器)
    Python入门学习笔记02(文件的打开、读写)
    Python入门学习笔记06(shelve模块)
    main参数
    [转]如何自动将c++程序接口封装供Python调用
  • 原文地址:https://www.cnblogs.com/redwind/p/6518808.html
Copyright © 2011-2022 走看看