连续两天没睡好,上午写代码时脑子跟团浆糊一样。中午去补了一觉,神清气爽。
这道题算是比较难的吧。每一个箱子都可以产生三组数据,对这些数据按面积从大到小排序。
数据处理的时候,如果一个箱子之前所有的箱子都没办法放在这个箱子下面,那就以这个箱子为底,生成一组数据。受习惯的影响, 刚开始我直接把之前最大的数据当成ans[i]的值。。。
最后需要从所有ans中选出最大的,还是受习惯的影响,第一遍的时候,我直接就把ans[j-1]当成最大数据输出了。测试倒是通过了,提交之后WA。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct node
{
int a,b;
int h,s;
}mark[105],temp[105];
int cmp(const void *a,const void *b)
{
return (*(node *)b).s-(*(node *)a).s;
}
int main()
{
int n,count;
int x,y,z;
int i,j,k;
int ans[105],t;
int sum;
count=0;
while(scanf("%d",&n),n)
{
count++;
j=0;
for(i=0;i<n;i++)
{
scanf("%d%d%d",&x,&y,&z);
mark[j].a=x; mark[j].b=y; mark[j].h=z; mark[j].s=x*y; j++;
mark[j].a=x; mark[j].b=z; mark[j].h=y; mark[j].s=x*z; j++;
mark[j].a=z; mark[j].b=y; mark[j].h=x; mark[j].s=y*z; j++;
}//每一组a,b,c都会生成三组数据。
qsort(mark,j,sizeof(mark[0]),cmp);//将数据按照面积排列。
memset(ans,0,sizeof(ans));
ans[0]=mark[0].h;
temp[0].a=mark[0].a;
temp[0].b=mark[0].b;
temp[0].s=mark[0].s;
for(i=1;i<j;i++)
{
ans[i]=mark[i].h;
temp[i].a=mark[i].a;
temp[i].b=mark[i].b;
temp[i].s=mark[i].s;//如果修改一下的话,这个temp应该是可以去掉的。temp记录的是最上面的箱子的数据。
for(k=0;k<i;k++)
{
if(temp[k].s>temp[i].s&&(temp[k].a>mark[i].a&&temp[k].b>mark[i].b||temp[k].b>mark[i].a&&temp[k].a>mark[i].b))
{
t=ans[k]+mark[i].h;
if(t>ans[i])
ans[i]=t;
}
}
}
sum=0;
for(i=0;i<j;i++)
if(ans[i]>sum)
sum=ans[i];//找出最大的值
printf("Case %d: maximum height = %d\n",count,sum);
}
return 0;
}