P4823 [TJOI2013] 拯救小矮人
感觉这个题的操作很新奇,做个记录。
大概题面:
一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决
定搭一个人梯。即:一个小矮人站在另一小矮人的肩膀上,直到最顶端
的小矮人伸直胳膊可以碰到陷阱口。
对于每一个小矮人,我们知道他从脚到肩膀的高度 \(A_i\),并且他的胳膊长
度为 \(B_i\)。陷阱深度为 \(H\)。
如果我们利用矮人 \(1\),矮人 \(2\),矮人 \(3\),\(\ldots\),矮人 \(k\) 搭一个梯子,满足
\(A_1 + A_2 + A_3 + \ldots + A_k + B_k \geq H\),那么矮人 \(k\) 就可以离开陷阱逃跑了,
一旦一个矮人逃跑了,他就不能再搭人梯了。
我们希望尽可能多的小矮人逃跑,问最多可以使多少个小矮人逃跑。
数据范围:\(1 \leq N\leq 2000\),\(1 \leq A_i,B_i,H\leq10^5\)。
1:贪心+dp
首先小矮人出去一定与顺序有关,前一个小矮人出去可能导致后面小矮人无法出去。
那么从贪心的角度思考,将小矮人按 \(a_i+b_i\) 从小到大排序,
可以对比,当 \(a_i+b_i < a_j+b_j\) 时,\(H+a_i+b_i\) 与 \(H+a_j+b_j\) 那个更优? (*交换对比)
发现当 \(a_i+b_i\) 先出去时,其他小矮人更有机会出去,而 \(a_j+b_j\) 先出去时,其他小矮人可能够不到而无法出去。
当 \(a_i+b_i = a_j+b_j\) 时,显然 \(a_i\) 较大的人应该留下(让人梯更长)。
我们发现 \(N\) 较小,可以枚举考虑到每个人的状态,考虑dp。
接下来考虑如何dp。很自然的想到有 \(f_{i,j}=x\) 为枚举第 \(i\) 个小矮人时,人梯长度为 \(j\) 时,最多能逃出 \(x\) 个人。 (我好菜...)
发现 \(j\) 很大,不好转移。所以交换一下,改成:
\(f_{i,j}=x\) 为枚举第 \(i\) 个小矮人时,能逃出 \(j\) 个人时,人梯长度最大为 \(x\) 。 (*枚举信息交换)
考虑转移,当有 \(f_{i-1,j-1}+b_i \geq H\) 时,小矮人 \(i\) 可以逃出。
则此时有 \(f_{i,j}=max(f_{i,j},f_{i-1,j-1}-a_i)\)
我们发现 \(f_{i,j}\) 在转移时只与上一位 \(i-1\) 有关,所以考虑滚动数组将 \(i\) 这一维优化掉。 (*滚动数组)
则:\(f_j=max(f_j , f_{j-1}-a_i)\)
Code:
#include<bits/stdc++.h>
using namespace std;
const int N=2005;
int n,h;
struct node{
int x,y;
bool operator<(const node& p)const{
if(x+y==p.x+p.y)return x<p.x;
else return x+y<p.x+p.y;
}
}a[N];
int f[N];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].y);
sort(a+1,a+1+n);
scanf("%d",&h);
memset(f,-0x3f,sizeof(f));
f[0]=0;
for(int i=1;i<=n;i++)f[0]+=a[i].x;
for(int i=1;i<=n;i++){
for(int j=n;j>=1;j--){
if(f[j-1]+a[i].y>=h){
f[j]=max(f[j],f[j-1]-a[i].x);
}
}
}
for(int i=n;i>=0;i--){
if(f[i]>=0){
printf("%d\n",i);
break;
}
}
return 0;
}
这个题目也可以用反悔贪心,(有时间就写在别的地方,补链接)
2:我学会了:
- 考虑顺序。并且可以通过交换在对比知道谁应该在前面。
- 有时不好枚举时可以交换信息
P4823 [TJOI2013] 拯救小矮人的更多相关文章
- [luogu] P4823 [TJOI2013]拯救小矮人(贪心)
P4823 [TJOI2013]拯救小矮人 题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以 ...
- [洛谷P4823] TJOI2013 拯救小矮人
问题描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口. 对于每一个小矮人,我们知道他从 ...
- Luogu P4823 [TJOI2013]拯救小矮人
题目 \(n^2\)的dp已经成为辣鸡做法了,%%%wch. 首先一个结论:\(a+b\)小的人在上. 这个东西我们有三种方法解决证明: 1.感性理解,\(a+b\)越大的人逃生能力越强,放在下面就越 ...
- 贪心+DP【洛谷P4823】 [TJOI2013]拯救小矮人
P4823 [TJOI2013]拯救小矮人 题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以 ...
- BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP
BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀 ...
- 【BZOJ3174】[TJOI2013]拯救小矮人(贪心,动态规划)
[BZOJ3174][TJOI2013]拯救小矮人(贪心,动态规划) 题面 BZOJ 洛谷 题解 我们定义一个小矮人的\(A_i+B_i\)为它的逃跑能力. 我们发现,如果有两个小矮人\(x,y\), ...
- BZOJ3174 Tjoi2013 拯救小矮人(贪心+DP)
传送门 Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个 ...
- bzoj3174 [Tjoi2013]拯救小矮人
Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人, ...
- bzoj 3174: [Tjoi2013]拯救小矮人
Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人, ...
- [TJOI2013]拯救小矮人[排序+dp]
题意 题目链接 分析 Imagine的完美回答 重点大概是证明我们选出要救的小矮人一定可以根据 \(a_i+b_i\) 的大小进行排序救出. 注意这里关注的对象是可以保留的高度,所以我们的dp值才会表 ...
随机推荐
- GitHub上狂揽62Kstars的程序员做饭指南
写在前面 作为一名程序员,我们经常会在全球最大的同性交友网站 GitHub上寻找一些优质的开源项目来学习,以提升自己的专业技能. 今天给大家推荐的是一个GitHub上狂揽61K的开源项目.项目名叫做H ...
- Ubuntu 下 python 安装pip
背景 python的强大在于它的第三方库. 安装 python2 sudo apt-get install python-pip python3 curl https://bootstrap.pypa ...
- Meilisearch 安装和使用教程
如今搜索功能已成为几乎所有应用不可或缺的一部分.无论是电商平台.内容管理系统,还是企业内部知识库,用户都期待能够快速.准确地找到他们需要的信息.然而,传统的搜索解决方案往往面临着诸多挑战:响应速度慢. ...
- 用const修饰指针
1)常量指针 语法:const 数据类型 *变量名; 不能通过解引用的方法修改内存地址中的值(用原始的变量名是可以修改的). 注意: l 指向的变量(对象)可以改变(之前是指向变量a的,后来可以改为指 ...
- javascript的内存(垃圾)回收机制?
垃圾回收机制 1.js中的内存回收 在js中,垃圾回收器每隔一段时间就会找出那些不再使用的数据,并释放其所占用的内存空间. 以全局变量和局部变量来说,函数中的局部变量在函数执行结束后这些变量已经不再被 ...
- 4. href 与 src?
href (Hypertext Reference)指定网络资源的位置,从而在当前元素或者当前文档和由当前属性定义的需要的锚点或资源之间定义一个链接或者关系.(目的不是为了引用资源,而是为了建立联系, ...
- 阿里云服务器安装Docker Compose
官网地址:https://docs.docker.com/compose/install/ 1. sudo curl -L "https://github.com/docker/compos ...
- webpack4.15.1 学习笔记(五) — 生产环境构建
目录 生产环境构建 指定环境 生产环境构建 development和production的构建目标差异很大.dev中,需要具有实时重新加载或HMR能力的 source map 和 server.而在p ...
- 题解:P10723 [GESP202406 七级] 黑白翻转
背景 汗流浃背了. 分析 容易想到一个显然的思路:以任意节点为根,开始遍历.如果一个节点的子树里面有黑点,那么它必须保留,否则如果它是白点,则可以删去. 但这个方法很容易举出反例: 在这颗树中,如果以 ...
- 2023/4/20 SCRUM个人博客
1.我昨天的任务 学习了PYQT5的部分控件,例如按钮,文本框,文本编辑框,并了解了一些基础布局以及部分对窗口的自定义实现 2.遇到了什么困难 无法理解信号和槽的概念 3.我今天的任务 学习信号和槽的 ...