\(\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!

最新文章

  1. 我为NET狂群福利:逆天常用的一些谷歌浏览器插件
  2. Evolutionary Computing: 5. Evolutionary Strategies(1)
  3. 有关Duilib的博客(持续更新)
  4. CSharp 如何通过拼接XML调用存储过程来查询数据
  5. docker一些命令
  6. 关于H5中的Canvas API的探索
  7. WinCacheGrind配合XDebug分析PHP程序性能
  8. power desinger 学习笔记&lt;五&gt;
  9. 数组操作- reverse sort each 操作
  10. UML[1] UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)(转)
  11. 【Android 应用开发】 ActionBar 样式详解 -- 样式 主题 简介 Actionbar 的 icon logo 标题 菜单样式修改
  12. Cocos2d-x场景变化相关功能介绍
  13. --@angularJS--浅谈class与Ng-Class的应用
  14. Java之集合的遍历与迭代器
  15. MySQL的常用命令:添加外键,修改字段名称,增加字段 设置主键自增长等
  16. lamp安装总结
  17. Week3_代码复审
  18. In-Place upgrade to Team Foundation Server (TFS) 2015 from TFS 2013Team Foundation Server TFS TFS 2015 TFS upgrade TFS with Sharepoint
  19. Linux如何通过命令查看日志文件的某几行(中间几行或最后几行)
  20. matlab读写图片,读取图像序列,读取AVI视频

热门文章

  1. Thrift框架-具体使用
  2. Linux上天之路(十)之Linux磁盘管理
  3. WebLogic任意文件上传漏洞(CVE-2019-2725)
  4. Python多环境管理神器(Anaconda)
  5. 微服务架构 | 3.1 Netflix Eureka 注册中心
  6. 《剑指offer》面试题44. 数字序列中某一位的数字
  7. CMake语法—内置变量
  8. vue开源项目有点全
  9. django之js模板插件artTemplate的使用
  10. 洛谷P7814 「小窝 R3」心の記憶