• poj2392 Space Elevator


    Description

    The cows are going to space! They plan to achieve orbit by building a sort of space elevator: a giant tower of blocks. They have K (1 <= K <= 400) different types of blocks with which to build the tower. Each block of type i has height h_i (1 <= h_i <= 100) and is available in quantity c_i (1 <= c_i <= 10). Due to possible damage caused by cosmic rays, no part of a block of type i can exceed a maximum altitude a_i (1 <= a_i <= 40000). 

    Help the cows build the tallest space elevator possible by stacking blocks on top of each other according to the rules.

    Input

    * Line 1: A single integer, K 

    * Lines 2..K+1: Each line contains three space-separated integers: h_i, a_i, and c_i. Line i+1 describes block type i.

    Output

    * Line 1: A single integer H, the maximum height of a tower that can be built

    Sample Input

    3
    7 40 3
    5 23 8
    2 52 6

    Sample Output

    48
    这题先要对a_i进行升序排序,因为每一个长度都有最大的限度,所以从最大限度值最小的开始背包。然后注意初始值都设为-1,dp[0]=0,因为这里要求的是恰好到一个高度,并不是小于等于就行(有点抽象,仔细体会一下)。
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    int max(int a,int b){
    	return a>b?a:b;
    }
    struct node{
    	int h,a,num;
    }b[500];
    bool cmp(node c,node d){
    	return c.a<d.a;
    }
    int dp[40050];
    
    int main()
    {
    	int n,m,i,j,k,sum;
    	while(scanf("%d",&n)!=EOF)
    	{
    		m=0;
    		for(i=1;i<=n;i++){
    			scanf("%d%d%d",&b[i].h,&b[i].a,&b[i].num);
    			if(b[i].a>m)m=b[i].a;
    		}
    		sort(b+1,b+1+n,cmp);
    		memset(dp,-1,sizeof(dp));
    		dp[0]=0;
    		for(i=1;i<=n;i++){
    			if(b[i].h*b[i].num>=b[i].a){
    				for(j=b[i].h;j<=b[i].a;j++){
    					if(dp[j-b[i].h]!=-1)dp[j]=0;
    				}
    			}
    			else{
    				k=1;sum=0;
    				while(sum+k<b[i].num){
    					sum+=k;
    					for(j=b[i].a;j>=k*b[i].h;j--){
    						if(dp[j-k*b[i].h]!=-1)dp[j]=0;
    					}
    					k*=2;
    				}
    				k=b[i].num-sum;
    				for(j=b[i].a;j>=k*b[i].h;j--){
    					if(dp[j-k*b[i].h]!=-1)dp[j]=0;
    				}
    			}
    		}
    		for(i=m;i>=0;i--){
    			if(dp[i]!=-1){
    				printf("%d
    ",i);break;
    			}
    		}
    	}
    	return 0;
    }


  • 相关阅读:
    javascript常用知识点总结
    【HOJ1356】【Miller_rabin素性测试】Prime Judge
    【POJ1568】【极大极小搜索+alpha-beta剪枝】Find the Winning Move
    【CF39E】【博弈论】What Has Dirichlet Got to Do with That?
    【BZOJ2281】【博弈论+DP】 [Sdoi2011]黑白棋
    【HDU3802】【降幂大法+矩阵加速+特征方程】Ipad,IPhone
    【POJ3243】【拓展BSGS】Clever Y
    【HDU2815】【拓展BSGS】Mod Tree
    【模板】【网络流】Dinic
    【模板】【凸包】Graham_scan
  • 原文地址:https://www.cnblogs.com/herumw/p/9464724.html
Copyright © 2020-2023  润新知