\(\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\),则现在有:

\[\begin{cases}
s+b\ge h\\
s-a+q\ge h
\end{cases}
\]

  尝试交换两人顺序:

\[\begin{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」逃生的更多相关文章

  1. Solution -「LOCAL」二进制的世界

    \(\mathcal{Description}\)   OurOJ.   给定序列 \(\{a_n\}\) 和一个二元运算 \(\operatorname{op}\in\{\operatorname{ ...

  2. Solution -「LOCAL」大括号树

    \(\mathcal{Description}\)   OurTeam & OurOJ.   给定一棵 \(n\) 个顶点的树,每个顶点标有字符 ( 或 ).将从 \(u\) 到 \(v\) ...

  3. Solution -「LOCAL」过河

    \(\mathcal{Description}\)   一段坐标轴 \([0,L]\),从 \(0\) 出发,每次可以 \(+a\) 或 \(-b\),但不能越出 \([0,L]\).求可达的整点数. ...

  4. Solution -「LOCAL」Drainage System

    \(\mathcal{Description}\)   合并果子,初始果子的权值在 \(1\sim n\) 之间,权值为 \(i\) 的有 \(a_i\) 个.每次可以挑 \(x\in[L,R]\) ...

  5. Solution -「LOCAL」Burning Flowers

      灼之花好评,条条生日快乐(假装现在 8.15)! \(\mathcal{Description}\)   给定一棵以 \(1\) 为根的树,第 \(i\) 个结点有颜色 \(c_i\) 和光亮值 ...

  6. Solution -「LOCAL」画画图

    \(\mathcal{Description}\)   OurTeam.   给定一棵 \(n\) 个点的树形随机的带边权树,求所有含奇数条边的路径中位数之和.树形生成方式为随机取不连通两点连边直到全 ...

  7. Solution -「LOCAL」ZB 平衡树

    \(\mathcal{Description}\)   OurOJ.   维护一列二元组 \((a,b)\),给定初始 \(n\) 个元素,接下来 \(m\) 次操作: 在某个位置插入一个二元组: 翻 ...

  8. Solution -「LOCAL」舟游

    \(\mathcal{Description}\)   \(n\) 中卡牌,每种三张.对于一次 \(m\) 连抽,前 \(m-1\) 次抽到第 \(i\) 种的概率是 \(p_i\),第 \(m\) ...

  9. Solution -「LOCAL」充电

    \(\mathcal{Description}\)   给定 \(n,m,p\),求序列 \(\{a_n\}\) 的数量,满足 \((\forall i\in[1,n])(a_i\in[1,m])\l ...

随机推荐

  1. vue 快速入门 系列 —— 模板

    其他章节请看: vue 快速入门 系列 模板 前面提到 vue 中的虚拟 dom 主要做两件事: 提供与真实节点对应的 vNode 新旧 vNode 对比,寻找差异,然后更新视图 ①.vNode 从何 ...

  2. 关于包装类Integer,Long比较用==和equals的问题

    所有整型包装类对象之间值的比较,全部使用 equals 方法比较. 说明:对于 Integer var = ? 在-128 至 127 之间的赋值,Integer 对象是在 IntegerCache. ...

  3. MATLAB绘图入门

    %%%1.运算符:(1).% mean() -->平均值 1.对于一个数组,mean(数组名)则返回均值2.对于一个矩阵,mean(数组名,1或2) 1代表返回矩阵每列的平均值 2代表返回矩阵每 ...

  4. golang中的数组

    1. 数组的声明 package main import "fmt" func main() { // 数组:定长且元素类型一致的数据集合 // 方式一:先声明在赋值,声明时内存中 ...

  5. cp 不提示按y

    yes|cp index.html.j2   yml -rf \cp index.html.j2   yml/ 两个效果是一样的

  6. Redis命令大全(超详细)

    一:序 其实本文的命令大家都可以去官网学习,但是我出这篇文章只是以更直观的方式来解读官网上的命令,让大家一眼可以看得懂,看的明白: 注意:我全文使用的Redis版本为 6.2.x 版本,低版本可能有些 ...

  7. Python:使用pyinstaller打包含有gettext locales语言环境的项目

    问题 如何使用 pyinstaller 打包使用了 gettext 本地化的项目,最终只生成一个 exe 文件 起因 最近在用 pyhton 做一个图片处理的小工具,顺便接触了一下 gettext,用 ...

  8. Nginx同server配置下配置多个localhost路由地址

    nginx多页面路由配置,进入 nginx/conf/nginx.conf: http { ...... server { listen 80; server_name localhost; loca ...

  9. ApacheCN 数据科学译文集 2020.8

    协议:CC BY-NC-SA 4.0 不要担心自己的形象,只关心如何实现目标.--<原则>,生活原则 2.3.c 在线阅读 ApacheCN 面试求职交流群 724187166 Apach ...

  10. AT2400 [ARC072B] Alice&Brown

    通过打表后可以发现,当初始石头数 \(|X - Y| \le 1\) 时先手必败否则先手必胜. 我们考虑使用归纳证明这个结论,显然 \((1, 0), (1, 1)\) 时是成立的. 基于观察,我们可 ...