zoukankan      html  css  js  c++  java
  • [TJOI2013]拯救小矮人

    题目描述

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

    对于每一个小矮人,我们知道他从脚到肩膀的高度Ai,并且他的胳膊长度为Bi。陷阱深度为H。

    如果我 们利用矮人1,矮人2,矮人3,。。。矮人k搭一个梯子,满足A1+A2+A3+....+Ak+Bk>=H,那么矮人k就可以离开陷阱逃跑了,一 旦一个矮人逃跑了,他就不能再搭人梯了。

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

    输入输出格式

    输入格式:

    第一行一个整数N, 表示矮人的个数,接下来N行每一行两个整数Ai和Bi,最后一行是H。(Ai,Bi,H<=10^5)

    输出格式:

    一个整数表示对多可以逃跑多少小矮人

    输入输出样例

    输入样例#1:

    2
    20 10
    5 5
    30

    输出样例#1:

    2

    输入样例#2:

    2
    20 10
    5 5
    35

    输出样例#2:

    1

    说明

    30%的数据 N<=200
    100%的数据 N<=2000


    贪心 + DP

    这题搞了半天

    不过贪心思路还是比较妙的虽然我想不出来

    我们可以按照身高+臂长来从小到大排序

    因为身高+臂长大的一定能比小的后跑

    所以我们就让身高+臂长小的先跑

    这样跑的顺序肯定是正确的

    但是有的身高+臂长小的在当前人梯高度下跑不了了

    那么就让更NB跑出来 , 所以要跳过某些人

    这样就只能DP了

    (f[i])表示已经跑走i个小矮人之后人梯最高还能有多高

    然后先去枚举每个人

    再去枚举跑走几个人后的人梯高度

    如果能跑就更新一下f[]

    如果当前f[i]被更新到了,就说明有i个人已经能跑出去了

    就更新一次答案

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    const int M = 2005 ;
    using namespace std ;
    inline int read() {
    	char c = getchar() ; int x = 0 , w = 1 ;
    	while(c>'9'||c<'0') { if(c=='-') w = -1 ; c = getchar() ; }
    	while(c>='0'&&c<='9') { x = x*10+c-'0' ; c = getchar() ; }
    	return x*w ;
    }
    int n , m ;
    struct Node { int Height , Leg ; }p[M];
    inline bool operator < (Node a , Node b) { return a.Height + a.Leg < b.Height + b.Leg ; }
    int f[M] , tot ;
    int main() {
    	memset(f , -1 , sizeof(f)) ;
    	n = read() ; f[0] = 0 ;
    	for(int i = 1 ; i <= n ; i ++) {
    		p[i].Height = read() , p[i].Leg = read() ;
    		f[0] += p[i].Height ;
    	}
    	m = read() ;
    	sort(p + 1 , p + n + 1) ;
    	for(int i = 1 ; i <= n ; i ++)
    	    for(int j = tot ; j >= 0 ; j --) {
    	    	if(f[j] + p[i].Leg >= m)
    	    		f[j + 1] = max(f[j + 1] , f[j] - p[i].Height) ;
    		    if(~f[tot + 1]) ++tot ;
    		}
    	printf("%d
    ",tot) ;
    	return 0 ;
    }
    
  • 相关阅读:
    两个页面相同js方法兼容
    两个页面js方法兼容
    jQuery Chosen 使用
    我写的一个抓取基金净值的工具
    自己做的一个固定大小对象内存池,效率大概为原始的new/delete的2倍
    用libevent实现的echo服务器及telnet客户端
    共享一个防止脚本重复启动的shell脚本
    神煞排盘软件
    一个在字符串中查找多个关键字的函数strstrs(三种不同算法实现及效率分析)
    写了一个时间处理的类,能将人类时间转换成距离公元零年一月一日秒数(时间戳),同时支持时间戳转换成日期时间
  • 原文地址:https://www.cnblogs.com/beretty/p/9594585.html
Copyright © 2011-2022 走看看