hdu1069: Monkey and Banana

hdu1069: http://acm.hdu.edu.cn/showproblem.php?pid=1069
题意:用长方体叠梯子,大的放下面,小的放上面,求最高高度
解法:排序+枚举+dp:先按面积大小将所有长方体进行排序,再枚举放在上面和下面的长方体,用v[i].ah表示以i为底的小梯子的高度,则v[i].ah+=max(v[j].ah)(0<=j<i),表示原来的梯子叠上以j为底的梯子的高度,最后再去最大值。
code:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
struct area
{
    int ac,ak,ah;
}v[50*3];
bool cmp(area x,area y)
{
    return (x.ac*x.ak)<(y.ac*y.ak);
}
int main()
{
    int n,a,b,c,t,max,cout=0;
    while(1)
    {
        scanf("%d",&n);
        if(n==0)break;
        cout++;t=0;
        for(int i=0;i<n;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            v[t].ac=a;v[t].ak=b;v[t++].ah=c;
            v[t].ac=b;v[t].ak=c;v[t++].ah=a;
            v[t].ac=c;v[t].ak=a;v[t++].ah=b;
        }
        sort(v,v+t,cmp);   //对面积从小到大排序,使前面的长方体一定得放在上面或者不能放
        for(int i=1;i<t;i++)     //枚举放在下面的长方体
        {
            max=0;
            for(int j=0;j<i;j++)   //枚举放在上面的长方体
            {
                if((v[i].ac>v[j].ac&&v[i].ak>v[j].ak||v[i].ac>v[j].ak&&v[i].ak>v[j].ac)&&v[j].ah>max)    //找出可以放在i上面的所有长方体中高最大的
                    max=v[j].ah;
            }
            v[i].ah+=max;       //v[i].ah表示以i为底叠成的梯子的最大高度
        }
        max=0;
        for(int i=0;i<t;i++)
        {
            if(v[i].ah>max)
                max=v[i].ah;
        }
        printf("Case %d: maximum height = %d\n",cout,max);
    }
}
/*input:
1
10 20 30
2
6 8 10
5 5 5
7
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
5
31 41 59
26 53 58
97 93 23
84 62 64
33 83 27
0
output:
Case 1: maximum height = 40
Case 2: maximum height = 21
Case 3: maximum height = 28
Case 4: maximum height = 342
*/

posted on 2012-07-25 15:47  acmer-jun  阅读(266)  评论(0编辑  收藏  举报

导航