zoukankan      html  css  js  c++  java
  • BZOJ4977: [[Lydsy1708月赛]跳伞求生(不错的贪心)

    4977: [[Lydsy1708月赛]跳伞求生

    Time Limit: 5 Sec  Memory Limit: 256 MB
    Submit: 446  Solved: 142
    [Submit][Status][Discuss]

    Description

    小Q最近沉迷于《跳伞求生》游戏。他组建了一支由n名玩家(包括他自己)组成的战队,编号依次为1到n。这个游
    戏中,每局游戏开始时,所有玩家都会从飞机上跳伞,选择一个目的地降落,跳伞和降落的时间有早有晚。在某局
    游戏降落前,他们在空中观察发现地面上一共有m间房子,编号依次为1到m。其中每间房子恰好有一名敌人早于他
    们到达。小Q战队的第i名玩家拥有a_i发子弹,地面上第i间房子里的敌人拥有b_i发子弹,消灭他可以获得c_i点积
    分。每名玩家必须且只能选择一间房子降落,然后去消灭里面的敌人。若第i名玩家选择了第j间房子,如果a_i>b_
    j,那么他就可以消灭该敌人,获得a_i-b_j+c_j的团队奖励积分,否则他会被敌人消灭。为了防止团灭,小Q不允
    许多名玩家选择同一间房子,因此如果某位玩家毫无利用价值,你可以选择让他退出游戏。因为房子之间的距离过
    长,你可以认为每名玩家在降落之后不能再去消灭其它房间里的敌人。作为小Q战队的指挥,请制定一套最优的降
    落方案,使得最后获得的团队奖励总积分最大

    Input

    第一行包含两个正整数n,m(1<=n,m<=100000),分别表示战队的玩家数和地面上的房间数。
    第二行包含n个正整数a_1,a_2,...,a_n(1<=a_i<=100000),分别表示每个玩家的子弹数。
    接下来m行,每行两个正整数b_i,c_i(1<=b_i,c_i<=100000),分别表示每个敌人的子弹数和奖励积分。

    Output

    输出一行一个整数,即最后获得的团队奖励总积分的最大值。

    Sample Input

    3 3
    4 4 4
    2 3
    1 3
    5 3

    Sample Output

    11

    HINT

    Source

    思路:假设配对了P对,a序列肯定最大的P个。  我们对a从大到小排序,对敌人按照b从大到小按照。  假设当前的敌人b>=a,那么现在这个敌人配对不了,但是他如果可以取替换前面的收益小的敌人,一定可以替换,因为他的b小于前面的b,一定能找到合适的a。  这部分用set维护就ok了。

    关键是最后,我们删去和为负的部分,因为这尾巴只会拉低收益。

    #include<bits/stdc++.h>
    #define rep(i,a,b) for(int i=a;i<=b;i++)
    #define ll long long
    #define F first
    #define S second
    using namespace std;
    const int maxn=100010;
    int a[maxn]; pair<int,int>b[maxn];
    multiset<int>s1,s2;
    multiset<int>::iterator it;
    int main()
    {
        int N,M; ll ans=0;
        scanf("%d%d",&N,&M);
        rep(i,1,N) scanf("%d",&a[i]);
        rep(i,1,M) scanf("%d%d",&b[i].F,&b[i].S);
        sort(a+1,a+N+1); sort(b+1,b+M+1); int tail=M;
        for(int i=N;i>=1;i--){
            while(b[tail].F>=a[i]){
                int tmp=b[tail].S-b[tail].F;
                if(!s2.empty()&&*s2.begin()<tmp){
                    ans-=*s2.begin(); ans+=tmp;
                    s2.erase(s2.begin()); s2.insert(tmp);
                }
                tail--;
            }
            if(!tail) break;
            ans+=b[tail].S-b[tail].F+a[i];
            s1.insert(a[i]); s2.insert(b[tail].S-b[tail].F);
            tail--;
        }
        while(!s1.empty()){
            if(*s1.begin()+*s2.begin()<0){
                ans-=(*s1.begin()+*s2.begin());
                s1.erase(s1.begin()); s2.erase(s2.begin());
            }
            else break;
        }
        printf("%lld
    ",ans);
        return 0;
    }
  • 相关阅读:
    解决MySQL报错The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents .....
    不安装Oracle客户端,用plsql连接远程Oracle数据库(绝对解决你的问题)
    Java中的String,StringBuilder,StringBuffer三者的区别
    字符串截取的常用方法
    java 项目 导入成功后jsp页面报错处理方法
    PL/SQL Developer安装详解(32位客户端免安装版)
    oracle 11g如何完全卸载
    Struts2下载文件点取消出现的异常解决
    Web框架们
    Django【进阶篇 】
  • 原文地址:https://www.cnblogs.com/hua-dong/p/9972939.html
Copyright © 2011-2022 走看看