感觉这个题的操作很新奇,做个记录。

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:我学会了:

  1. 考虑顺序。并且可以通过交换在对比知道谁应该在前面。
  2. 有时不好枚举时可以交换信息

P4823 [TJOI2013] 拯救小矮人的更多相关文章

  1. [luogu] P4823 [TJOI2013]拯救小矮人(贪心)

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

  2. [洛谷P4823] TJOI2013 拯救小矮人

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

  3. Luogu P4823 [TJOI2013]拯救小矮人

    题目 \(n^2\)的dp已经成为辣鸡做法了,%%%wch. 首先一个结论:\(a+b\)小的人在上. 这个东西我们有三种方法解决证明: 1.感性理解,\(a+b\)越大的人逃生能力越强,放在下面就越 ...

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

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

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

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

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

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

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

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

  8. bzoj3174 [Tjoi2013]拯救小矮人

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

  9. bzoj 3174: [Tjoi2013]拯救小矮人

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

  10. [TJOI2013]拯救小矮人[排序+dp]

    题意 题目链接 分析 Imagine的完美回答 重点大概是证明我们选出要救的小矮人一定可以根据 \(a_i+b_i\) 的大小进行排序救出. 注意这里关注的对象是可以保留的高度,所以我们的dp值才会表 ...

随机推荐

  1. 美团携手HarmonyOS SDK,开启便捷生活新篇章

    华为开发者大会(HDC 2024)于6月21日在东莞松山湖拉开序幕,通过一系列精彩纷呈的主题演讲.峰会.专题论坛和互动体验,为开发者们带来了一场知识与技术的盛宴.6月23日,<HarmonyOS ...

  2. 基于cifar数据集合成含开集、闭集噪声的数据集

    前言 噪声标签学习下的一个任务是:训练集上存在开集噪声和闭集噪声:然后在测试集上对闭集样本进行分类. 训练集中被加入的开集样本,会被均匀得打上闭集样本的标签充当开集噪声:而闭集噪声的设置与一般的噪声标 ...

  3. xlookup与vlookup的区别

    区别还是很大的,vlookup暂时扔不了.

  4. (转载)linux命令英文缩写的含义(方便记忆)

    linux常用命令的英文单词缩写 命令缩写: ls:list(列出目录内容) cd:Change Directory(改变目录) su:switch user 切换用户rpm:redhat packa ...

  5. Linux开机启动自定义脚本

    方式一:chkconfig命令 首先编写好自启的脚本 /etc/init.d/test.sh #!/bin/sh # chkconfig: 2345 10 90 # 创建个文件 touch /opt/ ...

  6. Java中final用法与详解

    final作为Java中经常用到的关键字,了解final的使用方法是非常有必要的. 这里从final关键字在数据域.方法和类中三个方面分析final关键字的主要用法. final应用于基本数据类型 1 ...

  7. SpringBoot 接收Post请求参数,三种方式

    package net.cyb.demo.controller; import net.cyb.demo.domain.User; import net.cyb.demo.utils.JsonData ...

  8. JDK9之后 Eureka依赖

    <!--Eureka添加依赖开始--> <dependency> <groupId>javax.xml.bind</groupId> <artif ...

  9. oeasy教您玩转vim - 88 - # 自动命令autocmd

    ​ 自动命令 autocommand 回忆 上次我们研究的是外部命令grep 可以在vim中使用grep 搜索的结果进入了列表 可以打开.遍历.跳转.关闭这个列表 也可以给列表中的匹配行或者每个文件执 ...

  10. Day 10 - 动态规划与树状数组

    动态规划基础 主要介绍动态规划的基本思想,以及动态规划中状态及状态转移方程的设计思路,帮助各位初学者对动态规划有一个初步的了解. 引入 [IOI1994] 数字三角形. 给定一个 \(r\) 行的数字 ...