欢迎访问~原文出处——博客园-zhouzhendong

去博客园看该题解


题目传送门 - BZOJ4977 - 八月月赛 Problem G


题意

  小明组建了一支由n名玩家组成的战队,编号依次为1到n。每局游戏开始时,所有玩家都会从飞机上跳伞,选择一个目的地降落。他们发现地面上一共有m间房子,编号依次为1到m。每间房子有一名敌人。第i名玩家有ai发子弹,第i间房子里的敌人有bi发子弹,消灭他可以获得ci点积分。每名玩家必须且只能选择一间房子降落。若第i名玩家选择了第j间房子,如果ai>bj,他就可以消灭该敌人,获得ai-bj+cj的积分。如果某位玩家无价值,你可以让他退出。每名玩家在降落之后不能再去消灭其它房间里的敌人。请制定一套最优的降落方案,使得最后获得的总积分最大。输出这个最大值。

题解

  玩家的子弹是一定的。
  一个房子的贡献也是一定的,那么就是ci-bi。
  那么我们贪心的尽量让我们的玩家选择贡献大的房子。
  所以我们先按照房子的贡献排序。
  然后依次选择下去,用一个set维护ai。对于一个房子,我们要选择能剩余未选择的玩家中能打下它的尽量小的,所以upper_bound。
  与此同时,我们统计出可以打下的房子个数tot以及这些房子各自的贡献值v。
  如果我们要选择一些人来打房子,那么一定会选择最大的。
  于是我们把ai降序排序,然后用前tot个来打。
  打的时候还是有讲究的。
  我们已经确定了贡献值序列v和a序列,各有tot个元素。
  我们都给他们升序排序。
  这个a序列一定是有办法打下所有的v的。
  但是,如果不打下所有的v,有可能会更赚。
  对于排好序的a[i]和v[i],如果a[i]+v[i]<0,那么还是不打这个房子v[i]了。
  亏的。
  那么,我们可以稍微的改动一下。
  因为a[i]和v[i]都是排好序的,所以其实就是前面的一段不打了。
  为什么不打?假如可以打掉,也是亏的。
  我们考虑打tot组的方案,那么总价值是一定的。
  而对于tot组去掉一组的情况,那么更改的总价值也是一定的。
  是什么呢,就是在人中踢去一个最弱的,在v[i]中也踢去一个最没用的。
  那么之后的tot-1组一定可以保证可以每个都打掉。为什么?回忆之前的打法。
  那么,这tot组和tot-1组的总价值差是什么呢,就是扔掉的人和房子的a[i]+v[i]。
  所以,我们从小到大,依次尝试扔掉人和房子,直到人和房子的价值和不再是负的位置。

代码

#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <set>
using namespace std;
typedef long long LL;
const int N=100000+5;
int n,m,a[N],v[N],tt[N];
struct House{
int b,c,v;
bool operator < (const House x) const{
if (v==x.v)
return b>x.b;
return v>x.v;
}
}h[N];
set <int> p;
bool cmp_BigFirst(int a,int b){
return a>b;
}
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1,cmp_BigFirst);
for (int i=1;i<=m;i++){
scanf("%d%d",&h[i].b,&h[i].c);
h[i].v=h[i].c-h[i].b;
}
memset(tt,0,sizeof tt);
p.clear();
for (int i=1;i<=n;i++){
p.insert(a[i]);
tt[a[i]]++;
}
int tot=0;
sort(h+1,h+m+1);
for (int i=1;i<=m;i++){
if (p.upper_bound(h[i].b)==p.end())
continue;
int now=*p.upper_bound(h[i].b);
tt[now]--;
if (!tt[now])
p.erase(now);
v[++tot]=h[i].v;
}
LL ans=0;
sort(v+1,v+tot+1);
sort(a+1,a+tot+1);
for (int i=1;i<=tot;i++)
if (a[i]+v[i]>0)
ans+=a[i]+v[i];
printf("%lld",ans);
return 0;
}

  

BZOJ4977 八月月赛 Problem G 跳伞求生 set 贪心的更多相关文章

  1. BZOJ4974 八月月赛 Problem D 字符串大师 KMP

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4974 - 八月月赛 Problem D 题意概括 一个串T是S的循环节,当且仅当存在正整数k,使得 ...

  2. BZOJ4972 八月月赛 Problem B 小Q的方格纸 二维前缀和

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4972 八月月赛Problem B 题目概括 一个矩阵,一坨询问,问矩阵中一个特定方向的等腰直角三角 ...

  3. 2018.09.24 bzoj4977: [[Lydsy1708月赛]跳伞求生(贪心+线段树)

    传送门 线段树好题. 这题一看我就想贪心. 先把a,b数组排序. 然后我们选择a数组中最大的b个数(不足b个就选a个数),分别贪心出在b数组中可以获得的最大贡献. 这时可以用线段树优化. 然后交上去只 ...

  4. BZOJ4977 跳伞求生(贪心)

    如果现在选定了一些要求消灭的敌人而不考虑积分,显然应该让每个敌人被刚好能消灭他的人消灭.再考虑最大化积分,显然我们应该优先消灭ci-bi大的敌人,所选用的a也应尽量大.于是按ci-bi从大到小排序,用 ...

  5. BZOJ4977: [[Lydsy1708月赛]跳伞求生(不错的贪心)

    4977: [[Lydsy1708月赛]跳伞求生 Time Limit: 5 Sec  Memory Limit: 256 MBSubmit: 446  Solved: 142[Submit][Sta ...

  6. BZOJ4977[Lydsy1708月赛]跳伞求生——贪心+堆+模拟费用流

    题目链接: 跳伞求生 可以将题目转化成数轴上有$n$个人和$m$个房子,坐标分别为$a_{i}$和$b_{i}$,每个人可以进一个他左边的房子,每个房子只能进一个人.每个房子有一个收益$c_{i}$, ...

  7. [bzoj4977]跳伞求生<贪心>

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4977 这是八月月赛的一道题,月赛的时候和同学讨论了一下,最后由一位叫二哥的大佬率先AC,用 ...

  8. 【刷题】BZOJ 4977 [Lydsy1708月赛]跳伞求生

    Description 小Q最近沉迷于<跳伞求生>游戏.他组建了一支由n名玩家(包括他自己)组成的战队,编号依次为1到n.这个游 戏中,每局游戏开始时,所有玩家都会从飞机上跳伞,选择一个目 ...

  9. 实验9:Problem G: 克隆人来了!

    想要输出""的话: cout<<"A person whose name is \""<<name<<" ...

随机推荐

  1. FastReport使用List的方法

    public class User { string username; string password; public User(string username, string password) ...

  2. JavaScript/HTML/CSS 之 iframe自适应高度

    最高效简介的手段是利用CSS的内置calc函数: iframe{ height:calc(100vh - 50px) auto;//假令:html顶部有高度为50px的导航条 //min-height ...

  3. [JXOI2018]游戏 (线性筛,数论)

    [JXOI2018]游戏 \(solution:\) 这一道题的原版题面实在太负能量了,所以用了修改版题面. 这道题只要仔细读题,我们就可以将题目的一些基本性质分析出来:首先我们定义:对于某一类都可以 ...

  4. CDH集群中YARN的参数配置

    CDH集群中YARN的参数配置 前言:Hadoop 2.0之后,原先的MapReduce不在是简单的离线批处理MR任务的框架,升级为MapReduceV2(Yarn)版本,也就是把资源调度和任务分发两 ...

  5. 2017-2018-2 20155303『网络对抗技术』Exp1:PC平台逆向破解

    2017-2018-2 『网络对抗技术』Exp1:PC平台逆向破解 --------CONTENTS-------- 1. 逆向及Bof基础实践说明 2. 直接修改程序机器指令,改变程序执行流程 3. ...

  6. Linux 文件系统扩展属性【转】

    转自:https://blog.csdn.net/ganggexiongqi/article/details/7661024 扩展属性(xattrs)提供了一个机制用来将<键/值>对永久地 ...

  7. windows环境变量PATH顺序的重要性

    PATH是路径的意思,PATH环境变量中存放的值,就是一连串的路径.不同的路径之间,用英文的分号间隔开.系统在执行用户命令时,若用户未给出绝对路径,则首先在当前目录下寻找相应的可执行文件.批处理文件等 ...

  8. 深入解析内存原理:RAM的基本原理

    1. 寻址原理概述RAM 主要的作用就是存储代码和数据供CPU 在需要的时候调用.但是这些数据并不是像用袋子盛米那么简单,更像是图书馆中用有格子的书架存放书籍一样,不但要放进去还要能够在需要的时候准确 ...

  9. 读SRE Google运维解密有感(三)

    前言 这是读“SRE Google运维解密”有感第三篇,之前的文章可访问www.addops.cn来查看.我们今天来聊聊“on call”也就是运维值班制度, 本人到目前为止也还在参与一线运维的值班, ...

  10. client模式下对应接口加入桥接出错

    client模式下,响应的接口wlan0 加入桥接时出现如下错误: root@root:~# brctl addif br-lan wlan0brctl: bridge br-lan: Operati ...