Solution -「LOCAL」逃生
\(\mathcal{Description}\)
有 \(n\) 个人掉进了深度为 \(h\) 的坑里,第 \(i\) 个人的肩高为 \(a_i\),臂长为 \(b_i\)。设当前坑里人的集合为 \(S\),第 \(i\) 人能逃生,当且仅当 \(\sum_{j\in S}a_j+b_i\ge h\)。求最多逃生人数。
\(n\le2\times10^5\)。
\(\mathcal{Solution}\)
考虑在最优情况下,相邻两个逃生的人,设其肩高臂长分别为 \((a,b),(p,q)\),未逃生者肩高之和 \(s\),则现在有:
s+b\ge h\\
s-a+q\ge h
\end{cases}
\]
尝试交换两人顺序:
s+q\ge h\\
s-p+b\ge h
\end{cases}
\]
不难发现 \(b-p\le q-a\) 时,前式可推出后时,可结合题意理解为“前者逃生,考虑为后者手变短,那么后者手越长越优”。依此排序。
此后,顺序扫一遍,若当前人能逃生直接逃生。但为保证最优,我们需要最大化坑里人的 \(\sum a_i\)。这时考虑一个反悔操作——用逃生的一个人来替换当前这个人。显然由于贪心的排序,替换一定成立,只要逃生的人的肩高大于当前人,替换就会优化答案,所以直接抓肩高最大的人回坑里就好。
复杂度 \(\mathcal O(n\log n)\)。
\(\mathcal{Code}\)
#include <queue>
#include <cstdio>
#include <algorithm>
typedef long long LL;
inline int rint () {
int x = 0; char s = getchar ();
for ( ; s < '0' || '9' < s; s = getchar () );
for ( ; '0' <= s && s <= '9'; s = getchar () ) x = x * 10 + ( s ^ '0' );
return x;
}
const int MAXN = 2e5;
int n, H;
LL sum;
std::priority_queue<int> heap;
struct Person {
int a, b;
inline void read () { a = rint (), b = rint (); }
inline bool operator < ( const Person t ) const { return b - t.a < t.b - a; }
} per[MAXN + 5];
int main () {
freopen ( "escape.in", "r", stdin );
freopen ( "escape.out", "w", stdout );
n = rint ();
for ( int i = 1; i <= n; ++ i ) per[i].read (), sum += per[i].a;
H = rint ();
int ans = 0;
std::sort ( per + 1, per + n + 1 );
for ( int i = 1; i <= n; ++ i ) {
heap.push ( per[i].a );
if ( sum + per[i].b >= H ) ++ ans;
else sum += heap.top (), heap.pop ();
sum -= per[i].a;
}
printf ( "%d\n", ans );
return 0;
}
\(\mathcal{Details}\)
也是够勇的,不拍就过了这道智慧贪心题 owo!
Solution -「LOCAL」逃生的更多相关文章
- Solution -「LOCAL」二进制的世界
\(\mathcal{Description}\) OurOJ. 给定序列 \(\{a_n\}\) 和一个二元运算 \(\operatorname{op}\in\{\operatorname{ ...
- Solution -「LOCAL」大括号树
\(\mathcal{Description}\) OurTeam & OurOJ. 给定一棵 \(n\) 个顶点的树,每个顶点标有字符 ( 或 ).将从 \(u\) 到 \(v\) ...
- Solution -「LOCAL」过河
\(\mathcal{Description}\) 一段坐标轴 \([0,L]\),从 \(0\) 出发,每次可以 \(+a\) 或 \(-b\),但不能越出 \([0,L]\).求可达的整点数. ...
- Solution -「LOCAL」Drainage System
\(\mathcal{Description}\) 合并果子,初始果子的权值在 \(1\sim n\) 之间,权值为 \(i\) 的有 \(a_i\) 个.每次可以挑 \(x\in[L,R]\) ...
- Solution -「LOCAL」Burning Flowers
灼之花好评,条条生日快乐(假装现在 8.15)! \(\mathcal{Description}\) 给定一棵以 \(1\) 为根的树,第 \(i\) 个结点有颜色 \(c_i\) 和光亮值 ...
- Solution -「LOCAL」画画图
\(\mathcal{Description}\) OurTeam. 给定一棵 \(n\) 个点的树形随机的带边权树,求所有含奇数条边的路径中位数之和.树形生成方式为随机取不连通两点连边直到全 ...
- Solution -「LOCAL」ZB 平衡树
\(\mathcal{Description}\) OurOJ. 维护一列二元组 \((a,b)\),给定初始 \(n\) 个元素,接下来 \(m\) 次操作: 在某个位置插入一个二元组: 翻 ...
- Solution -「LOCAL」舟游
\(\mathcal{Description}\) \(n\) 中卡牌,每种三张.对于一次 \(m\) 连抽,前 \(m-1\) 次抽到第 \(i\) 种的概率是 \(p_i\),第 \(m\) ...
- Solution -「LOCAL」充电
\(\mathcal{Description}\) 给定 \(n,m,p\),求序列 \(\{a_n\}\) 的数量,满足 \((\forall i\in[1,n])(a_i\in[1,m])\l ...
随机推荐
- vert.x框架-简单路由使用
package xue.myVertX; import io.vertx.core.AbstractVerticle; import io.vertx.core.Vertx; import io.ve ...
- iview 按需引入解决加载慢的问题
如果出现加载2s以上的情况请先查看服务器是否对大文件进行过压缩优化处理. 按照官方文档把iview引入到vue的项目中,全部引入的时候没问题.当按官方文档显示的按需加载是借助插件babel-plugi ...
- 微软开源Kubernetes服务网格项目Open Service Mesh
尽管微服务环境提供可移植性,允许更快更频繁的部署周期,甚至还能让组织创建关注于特定领域的团队,但这也伴随着对于流量管理.安全以及可观测性等需求的增长.在整个生态系统中,针对这些需求的服务网格模式的实现 ...
- SparkSQL学习笔记
概述 冠状病毒来临,宅在家中给国家做贡献之际,写一篇随笔记录SparkSQL的学习笔记,目的有二,一是记录整理之前的知识作为备忘录,二是分享技术,大家共同进步,有问题也希望大家不吝赐教.总体而言,大数 ...
- gin中的文件上传
1. 单文件上传 package main import ( "fmt" "github.com/gin-gonic/gin" "log" ...
- 【重构前端知识体系之HTML】HTML5给网页音频带来的变化
[重构前端知识体系之HTML]HTML5给网页音频带来的变化 引言 音乐播放,相信大家都很熟悉,但是早在之前的音乐播放之前,你的浏览器会问你,是否下载flash插件.然而现在,估计一些年轻的开发者都不 ...
- Redis入门及环境搭建
一:Redis简介 Redis(Remote Dictionary Server 远程字典服务)是一个开源的(BSD许可的)内存数据结构存储,用作数据库.高速缓存和消息队列代理. Redis提供五大基 ...
- mysql新增用户无法登陆问题解决ERROR 1045 (28000)
mysql增加新用户无法登陆解决方法 ERROR 1045 (28000): Access denied for user 'appadmin'@'localhost' (using password ...
- 使用Hot Chocolate和.NET 6构建GraphQL应用(4) —— 实现Query映射功能
系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 在上一篇文章使用Hot Chocolate和.NET 6构建GraphQL应用(3) -- 实现Query基 ...
- from 表单上传多个文件?
和单个上传文件基本相同,就是需要在后台控制器中,用数组来接收 jsp页面提交过来的file数据. 也分为三个部分演示. 一.jsp <%-- Created by IntelliJ IDEA. ...