練習三 1005

概述:給定一塊磚的 長寬高,讓你疊金字塔,下面磚的表面積必須大於上面的,求能疊到的最高高度。

思路:先將給定的所有的磚分成三種,這樣的話,一塊磚就有三種形態,然後將所有的排序,然後挑選,最後將所選的高加到一起即可。

感想:題意不太好理解。

    #include<iostream>  
    #include<cstdio>  
    #include<cstdlib>  
    #include<cstring>  
    #include<string>  
    #include<queue>  
    #include<algorithm>  
    #include<map>  
    #include<iomanip>  
    #define INF 99999999  
    using namespace std;  
      
    const int MAX=100;  
    int height[MAX];  
      
    typedef struct node{  
        int w;  
        int l;  
        int h;  
        bool operator<(node b)const{  
            if(w == b.w)return l>b.l;  
            return w>b.w;  
        }  
    };  
    node s[MAX];  
      
    int main(){  
        int n,a,b,c,num=1;  
        while(cin>>n,n){  
            int k=0;  
            for(int i=0;i<n;++i){  
                cin>>a>>b>>c;  
                //對a,b,c排序.   
                if(a>b)a=a+b,b=a-b,a=a-b;  
                if(a>c)a=a+c,c=a-c,a=a-c;  
                if(b>c)b=b+c,c=b-c,b=b-c;  
                s[k].w=a,s[k].l=b,s[k++].h=c;//以a,b爲底,c爲高.   
                s[k].w=a,s[k].l=c,s[k++].h=b;//以a,c爲底,b爲高.  
                s[k].w=b,s[k].l=c,s[k++].h=a;//以b.c爲底,a爲高.   
            }  
            sort(s,s+k);//排序,以底邊中最小的邊來排序,這樣使得第i個箱子只能放在第i個箱子的前面的箱子上,當然也可以按照底邊面積排序.   
            int Max=s[0].h;  
            height[0]=s[0].h;  
            for(int i=1;i<k;++i){  
                height[i]=s[i].h;  
                for(int j=0;j<i;++j){  
                    if(s[i].w<s[j].w && s[i].l<s[j].l){  
                        height[i]=max(height[i],s[i].h+height[j]);  
                    }  
                }  
                Max=max(Max,height[i]);  
            }  
            cout<<"Case "<<num++<<": maximum height = "<<Max<<endl;  
        }  
        return 0;  
    }  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章