zoukankan      html  css  js  c++  java
  • 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;
    }


  • 相关阅读:
    spring中的切入点
    spring AOP的基本概念
    sql server 批量修改数据表和存储过程的所有者(2000)或架构(2005)
    SQL SERVER 修改欄位(列)屬性或是名稱
    sql server 數據庫備份與還原 登錄名丟失 解決辦法
    开心农场给我们的20条人生启示
    sql建立遠端聯接
    windows无法存取指定的装置、路径或文件案
    Vs.net 2008 最搞笑的問題
    女儿长大了!
  • 原文地址:https://www.cnblogs.com/herumw/p/9464724.html
Copyright © 2011-2022 走看看