您的位置:首页 > 其它

UVA437

2015-10-08 19:52 316 查看
题意: N个立方体,给出长宽高,把他们堆起来,最高能堆多高,要求在下面的立方体的长宽严格大于在上面的。

其实原本我是不会的,然后看了网上大神的做法 = =详见代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
int c,k,g;
void init(int x,int y,int z)
{
c=x; k=y; g=z;
}
}a[200];
int len[200];
bool cmp(node x,node y)
{
return (x.c*x.k)<(y.c*y.k);
}
int main()
{
int n,x,y,z,cnt=0;
while(scanf("%d",&n)!=EOF && n)
{
int m=0;
for(int i=0;i<n;i++)
{
scanf("%d%d%d",&x,&y,&z);   // 立方体的六种摆放方法全部存起来
a[m++].init(x,y,z);
a[m++].init(x,z,y);
a[m++].init(y,x,z);
a[m++].init(y,z,x);
a[m++].init(z,x,y);
a[m++].init(z,y,x);
}
sort(a,a+m,cmp);  // 按照底面积排个序 ,在上面的立方体底面积一定小
int mx=-1; len[0]=1;
for(int i=1;i<m;i++)   // LIS 求最高高度
{
len[i]=a[i].g;
for(int j=0;j<i;j++)
{
if((a[i].c>a[j].c) && (a[i].k>a[j].k))
{
len[i]=max(len[i],len[j]+a[i].g);
mx=len[i]>mx?len[i]:mx;
}
}
}
printf("Case %d: maximum height = %d\n",++cnt,mx);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: