题意

一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯。即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口。对于每一个小矮人,我们知道他从脚到肩膀的高度Ai,并且他的胳膊长度为Bi。陷阱深度为H。如果我 们利用矮人\(1\),矮人\(2\),矮人\(3\),。。。矮人\(k\)搭一个梯子,满足\(A_1+A_2+A_3+....+A_k+B_k\leq H\),那么矮人\(k\)就可以离开陷阱逃跑了,一 旦一个矮人逃跑了,他就不能再搭人梯了。

我们希望尽可能多的小矮人逃跑, 问最多可以使多少个小矮人逃跑。

思路

已知两个相邻的小矮人\(a\)和\(b\),考虑交换\(ab\)位置的代价

首先如果\(a\)在\(b\)下面,那么第一次的高度是\(a.a+b.a+b.b\),第二次的高度是\(a.a+a.b\)

然后如果\(b\)在\(a\)下面,那么第一次的高度是\(a.a+b.a+a.b\),第二次的高度是\(b.a+b.b\)

我们要考虑的就是交换ab会对原来的答案有什么影响

比较直观的想法是关键看第二次的高度,因为第二次的高度更高的那个,最终一定比另一个优。

还要考虑可能会出现的第二个比另一个更高但是第一个不如另一个的情况。

即可能出现\(a.a+a.b>b.a+b.b\),但是\(a.a+b.a+b.b<a.a+b.a+a.b\),即\(a.b>a.a+b.b\)。要知道这是完全可能的

考虑在这种情况下,假设\(a.b>a.a+b.b\),那不交换的情况下第一次是\(a.a+b.a+b.b<a.b+b.a<b.b+a.b+a.a\)因此交换完还是更优

所以只需\(a.a+a.b<a.a+b.b\)即可

上面我们已经证明按贪心完的顺序取是最优的,但是还要确定最多能走掉多少个

接下来要\(dp\):令\(f[i]\)表示走完i个矮人之后还能取到的最大高度

这样贪心的作用就出来了:按照贪心完的顺序取走矮人,可以保证最优。

一开始初始化\(f[0]\)表示没有矮人走掉,\(f[0]=Σa[i]\)。

然后就是枚举取到第i个矮人,可以用它来更新\(f[j]\)的情况是\(f[j]+ai.b>=m\)。

这样就可以算出最大值了

代码

  1. # include<bits/stdc++.h>
  2. using namespace std;
  3. # define lowbit(x) ((x)&(-x))
  4. # define pi acos(-1.0)
  5. # define eps 1e-8
  6. # define MOD 100000007
  7. # define INF 1000000000
  8. # define mem(a,b) memset(a,b,sizeof(a))
  9. # define FOR(i,a,n) for(register int i=a; i<=n; ++i)
  10. # define FDR(i,a,n) for(register int i=a; i>=n; --i)
  11. # define bug puts("H");
  12. # define lch p<<1,l,mid
  13. # define rch p<<1|1,mid+1,r
  14. # define mp make_pair
  15. # define pb push_back
  16. typedef pair<int,int> PII;
  17. typedef vector<int> VI;
  18. # pragma comment(linker, "/STACK:1024000000,1024000000")
  19. typedef long long LL;
  20. inline char nc(){
  21. static char buf[1000000],*p1=buf,*p2=buf;
  22. return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
  23. }
  24. inline int Scan(){
  25. char ch=nc();int sum=0, f=1;
  26. if (ch=='-') f=-1, ch=nc();
  27. while(!(ch>='0'&&ch<='9'))ch=nc();
  28. while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=nc();
  29. return sum*f;
  30. }
  31. const int N=2005;
  32. //Code begin....
  33. struct Node{int x, y;}node[N];
  34. int dp[N];
  35. bool comp(Node a, Node b){return a.x+a.y<b.x+b.y;}
  36. int main ()
  37. {
  38. int n, ans, H;
  39. scanf("%d",&n);
  40. mem(dp,-1); dp[0]=0;
  41. FOR(i,1,n) scanf("%d%d",&node[i].x,&node[i].y), dp[0]+=node[i].x;
  42. scanf("%d",&H);
  43. sort(node+1,node+n+1,comp);
  44. FOR(i,1,n) FDR(j,i,1) if (dp[j-1]+node[i].y>=H) dp[j]=max(dp[j],dp[j-1]-node[i].x);
  45. FDR(i,n,0) if (dp[i]!=-1) {ans=i; break;}
  46. printf("%d\n",ans);
  47. return 0;
  48. }

BZOJ 3174 拯救小矮人(贪心+DP)的更多相关文章

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

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

  2. 【bzoj3174】[Tjoi2013]拯救小矮人 贪心+dp

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

  3. [TJOI2013] 拯救小矮人- 贪心,dp

    结论:矮的人比高的人先走一定不会使得答案变劣 于是我们排序后,像 0-1 背包那样依次考虑每个人走不走 #include <bits/stdc++.h> using namespace s ...

  4. BZOJ3174. [TJOI2013]拯救小矮人(dp)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3174 题解 其实此题并不需要那么多YY的部分. 我们考虑若干个小矮人逃出的顺序.若跳出的 ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 简单的django配置和命令

    1.创建项目:django-admin startproject 项目名称 2.进入项目:cd 项目名称 3.创建子应用:python manage.py startapp 子应用名称 4.把子应用添 ...

  2. Jmeter上传下载文件

    每次使用时都会忘记,此处是存储网路上通用的方式.   1.上传文件 记得勾选“use multipart/form-data for post”,表明此请求包含文件信息.在信息请求头中,需加入“Con ...

  3. #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)

    ((GPIO_TypeDef *) GPIOA_BASE)表示将GPIOA_BASE强制转换为指针类型的结构体, #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) ...

  4. 【H5】dropload (移动端下拉刷新,上拉加载)

    插件概要地址:http://ximan.github.io/dropload/ 一般下载其中的demo2对照修改即可使用. 小吐槽.我在项目中用的时候,有个后端说ajax麻烦但是还是要做体现他很热爱工 ...

  5. 20155301 Exp7 网络欺诈防范

    20155301 Exp7 网络欺诈防范 1.基础问题回答 (1)通常在什么场景下容易受到DNS spoof攻击 (2)在日常生活工作中如何防范以上两攻击方法 2.实践过程记录 简单应用SET工具建立 ...

  6. Android开发——Android多进程以及使用场景介绍

    个层级,具体可以查看Android开发--Android进程保活招式大全中1.1部分的内容,这里就不赘述了. 根据进程中当前活动组件的重要程度,Android 会将进程评定为它可能达到的最高级别.例如 ...

  7. Ubuntu+Qt+OpenCV+FFMPEG环境搭建

    基于ubuntu16.04下opencv3.2安装配置 Ubuntu16.04下安装FFmpeg(超简单版) Qt编译后提示: /usr/bin/ld: 找不到 -lGL 安装libGL: sudo ...

  8. 模拟赛 sutoringu

    sutoringu 题意: 询问有多少一个字符串内有多少个个子区间,满足可以分成k个相同的串. 分析: 首先可以枚举一个长度len,表示分成的k个长为len的串.然后从1开始,每len的长度分成一块, ...

  9. C# Language Specification 5.0 (翻译)第四章 类型

    C# 语言的类型分为两大类:值类型(value type)和引用类型(reference type),而它们又都同时具有至少一个类型形参的泛型类型(generic type).类型形参(type pa ...

  10. Java设计模式之适配器设计模式(项目升级案例)

    今天是我学习到Java设计模式中的第三个设计模式了,但是天气又开始变得狂热起来,对于我这个凉爽惯了的青藏人来说,又是非常闹心的一件事儿,好了不管怎么样,目标还是目标(争取把23种Java设计模式接触一 ...