题目链接

https://www.lydsy.com/JudgeOnline/problem.php?id=3174

题解

其实此题并不需要那么多YY的部分。

我们考虑若干个小矮人逃出的顺序。若跳出的 \(k\) 个小矮人依次为 \(p_1, p_2, \cdots , p_k\),那么我们一定可以将他们排序,使得对于任意的 \(i < j\) 满足 \(a_i + b_i < a_j + b_j\) 且按照该顺序依然能保证 \(k\) 个小矮人全部逃出。

证明如下:

若对于任意 \(i, j\),有 \(a_i + b_i < a_j + b_j\),且 \(j\) 比 \(i\) 先逃出,那么设 \(i\) 后面所有人的高度贡献为 \(s_1\),\(i\) 与 \(j\) 之间的人的高度贡献为 \(s_2\),\(h\) 为洞深,可得:

\[a_i + a_j +b_j \geq h - s_1 - s_2 \tag{1}$$ $$a_i + b_i \geq h - s_1 \tag{2}
\]

通过 \((2)\),我们可以推得:$$a_j + a_i + b_i \geq h - s_1 - s_2 \tag{3}$$

通过 \((2)\) 以及 \(a_i + b_i < a_j + b_j\),我们可以推得:$$a_j + b_j \geq h - s_1 \tag{4}$$

由 \((3), (4)\) 可以得出:\(i\) 比 \(j\) 先逃出依然是合法的。

这样,我们就证明了排序的正确性,那么就可以先排序再 dp 了。一个比较显然的状态是,我们设 \(f_{i, j}\) 表示考虑完排序后的前 \(i\) 个人,且已经逃走的人的 \(\sum a_k\) 的值为 \(j\) 时,最多能逃走多少人。不过由于 \(\sum a_k\) 可能很大,这样定义状态并不可行,因此我们需要把状态的第二维与状态本身的意义交换一下:设 \(f_{i, j}\) 表示考虑完排序后的前 \(i\) 个人,且已经逃走了 \(j\) 个人,这 \(j\) 个人的 \(\sum a_k\) 的最小值。这样,我们就能在 \(O(n^2)\) 的时间内完成这个 dp 了。

代码

#include<bits/stdc++.h>

using namespace std;

#define X first
#define Y second
#define mp make_pair
#define pb push_back
#define debug(...) fprintf(stderr, __VA_ARGS__) typedef long long ll;
typedef long double ld;
typedef unsigned int uint;
typedef pair<int, int> pii;
typedef unsigned long long ull; template<typename T> inline void read(T& x) {
char c = getchar();
bool f = false;
for (x = 0; !isdigit(c); c = getchar()) {
if (c == '-') {
f = true;
}
}
for (; isdigit(c); c = getchar()) {
x = x * 10 + c - '0';
}
if (f) {
x = -x;
}
} template<typename T, typename... U> inline void read(T& x, U&... y) {
read(x), read(y...);
} template<typename T> inline bool checkMax(T& a, const T& b) {
return a < b ? a = b, true : false;
} template<typename T> inline bool checkMin(T& a, const T& b) {
return a > b ? a = b, true : false;
} const int N = 2e3 + 10, inf = 0x3f3f3f3f; struct State {
int x, y;
State () {}
State (int x, int y): x(x), y(y) {}
bool operator < (const State& a) const {
return x + y < a.x + a.y;
}
} s[N]; int n, f[N][N], h; int main() {
read(n);
int sa = 0;
for (register int i = 1; i <= n; ++i) {
read(s[i].x, s[i].y), sa += s[i].x;
}
sort(s + 1, s + 1 + n);
read(h);
memset(f, 0x3f, sizeof f);
f[0][0] = 0;
for (register int i = 1; i <= n; ++i) {
for (register int j = 0; j <= i; ++j) {
f[i][j] = f[i - 1][j];
}
for (register int j = 1; j <= i; ++j) {
if (sa - f[i - 1][j - 1] + s[i].y >= h) {
checkMin(f[i][j], f[i - 1][j - 1] + s[i].x);
}
}
}
int ans = 0;
for (register int i = 1; i <= n; ++i) {
if (f[n][i] < inf) {
ans = i;
}
}
printf("%d\n", ans);
return 0;
}

BZOJ3174. [TJOI2013]拯救小矮人(dp)的更多相关文章

  1. BZOJ3174:[TJOI2013]拯救小矮人(DP)

    Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人, ...

  2. BZOJ3174 Tjoi2013 拯救小矮人(贪心+DP)

    传送门 Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个 ...

  3. bzoj3174 [Tjoi2013]拯救小矮人

    Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人, ...

  4. BZOJ3174 TJOI2013 拯救小矮人 贪心、DP

    传送门 原问题等价于:先给\(n\)个人排好顺序.叠在一起,然后从顶往底能走即走,问最多能走多少人 注意到一个问题:如果存在两个人\(i,j\)满足\(a_i + b_i < a_j + b_j ...

  5. bzoj千题计划208:bzoj3174: [Tjoi2013]拯救小矮人

    http://www.lydsy.com/JudgeOnline/problem.php?id=3174 按a+b从小到大排序,a+b小的在上面,先考虑让它逃出去 正确性不会证 感性理解一下,最后一个 ...

  6. 【BZOJ-3174】拯救小矮人 贪心 + DP

    3174: [Tjoi2013]拯救小矮人 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 686  Solved: 357[Submit][Status ...

  7. BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP

    BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀 ...

  8. 【BZOJ3174】[TJOI2013]拯救小矮人(贪心,动态规划)

    [BZOJ3174][TJOI2013]拯救小矮人(贪心,动态规划) 题面 BZOJ 洛谷 题解 我们定义一个小矮人的\(A_i+B_i\)为它的逃跑能力. 我们发现,如果有两个小矮人\(x,y\), ...

  9. 贪心+DP【洛谷P4823】 [TJOI2013]拯救小矮人

    P4823 [TJOI2013]拯救小矮人 题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以 ...

随机推荐

  1. 6、Spring Cloud -熔断器Hystrix

    6.1.什么是Hystrix 在分布式系统中.服务与服务之间的依赖错综复杂,一种不可避免的情况就是某些服务 出现故障,导致依赖于它们的其他服务出现远程调度的线程阻塞.   Hystrix是Netfli ...

  2. C#ref和out的区别-ref是有进有出,out是只出不进

    之前学习C#时候就遇到了这个问题,不过当时没有深究.昨晚想到这个问题时候自己尝试敲了敲代码,结果从运行的结果来看,越看越乱.在查看了一些资料的基础上,自己总结了一下. 可能会有点乱,但是自己总结出来的 ...

  3. HTTP 错误 401.0 - Unauthorized 的解决方案

    1.安装vs2015后,以前做的项目中Forms身份验证,竟然不能使用了 2.打开当前项目属性,将windows身份验证属性改为启用 3.vs2015生成的mvc项目中,webconfig缺失auth ...

  4. Dubbo实践(五)扩展Spring Schema

    先回顾Dubbo实践(一)中定义的dubbo-provider.xml: <?xml version="1.0" encoding="UTF-8"?> ...

  5. 【luogu P2827 蚯蚓】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2827 35分:暴力sortO(mnlogn). 80分:考虑到每次不好维护不被切的点+q,正难则反.改成维护 ...

  6. navicat导出数据库字典

    select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,COLUMN_TYPE,COLUMN_COMMENT from information_schema.column ...

  7. 前端基础-HTML的的标签详解

    阅读目录 一.head内常用标签 二. HTML语义化 三. 字符实体 四. h系列标签 五. p标签 六. img标签 七. a标签 八. 列表标签 九. table标签 十. form标签 一. ...

  8. Token ,Cookie和Session的区别

    在做接口测试时,经常会碰到请求参数为token的类型,但是可能大部分测试人员对token,cookie,session的区别还是一知半解. Cookie cookie 是一个非常具体的东西,指的就是浏 ...

  9. mysql千万级数据量根据索引优化查询速度

    (一)索引的作用 索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全表扫描,数据量少还可以,一旦数据量超过百万甚至千万,一条查询sql执行往往需要几十秒甚至更多,5秒以上就已经 ...

  10. jquery购物车添加功能

    <html> <head> <meta charset="UTF-8"> <title></title> <scr ...