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值才会表 ...
随机推荐
- 京东云上centos8.2 安装 consul1.11.1
做个笔记下 -- 前言 部分内容有参考网友的,但是地址不记得了! 安装内容基本参考官网的和上一个网友的 官网地址: https://www.consul.io/downloads 以下是使用root方 ...
- 【基础计算】ESDF栅格距离图计算并行加速版
前言与参考 这一部分仅为路径规划源码及论文GPIR的一个小部分,但是有代码实现,第一次看的时候有些懵,所以特此记录:主要是设置好了栅格地图后,添加了障碍物后,对其的欧式距离计算和梯度计算等.原代码中为 ...
- power bi 如何删除敏感度标签
经验证,此方法不够彻底,我的office excel打开后还是要添加敏感度标签,即使我把敏感度标签删掉也不行. 当我把创建敏感度标签的管理员账户删掉之后,虽然打开excel还是会显示敏感度标签,但是已 ...
- mobaXterm 查看密码
参考:MobaXterm中密码的查看方式 检查是否把密码保存到了注册表中 然后从https://github.com/HyperSine/how-does-MobaXterm-encrypt-pass ...
- HGAME2023 week1-week2
确实是高质量比赛,学到了很多知识.认识到了很多的不足. 任重而道远啊... hgame_week1 web Classic Childhood Game F12检查源码,打开Events.js 发现 ...
- 10分钟快速掌握分布式版本控制系统GIT命令集【形成知识体系篇】
任务要求 要求全部使用git命令实现 1.创建本地仓库,项目名称为hniu_site 2.在仓库下创建多级(目录)文件夹cn/hniu/班级名称(例如软件2108,cn/hniu/rj2108) 3. ...
- 重磅消息:微软发布多平台应用UI框架 MAUI,网友直呼:牛x
本文内容来自微软开发博客:https://devblogs.microsoft.com/dotnet/introducing-net-multi-platform-app-ui/ 转载请注明来源,公众 ...
- Odoo 基于Win10搭建基于Win10搭建odoo14开发环境搭建
实践环境 win10 Python 3.6.2 odoo_14.0.latest.tar.gz 下载地址: https://download.odoocdn.com/download/14/src?p ...
- java中使用jdbc连接数据库操作
先贴代码,在做说明 import java.sql.*; import java.util.ArrayList; import java.util.List; public class Conn { ...
- 使用 useRequestURL 组合函数访问请求URL
title: 使用 useRequestURL 组合函数访问请求URL date: 2024/7/26 updated: 2024/7/26 author: cmdragon excerpt: 摘要: ...