唉唉,这题没有想出来算法,然后针对别人的代码看了好长时间,又举例写了,然后根据理解用自己的风格写出来了代码!
#include<stdio.h>
#include<stdlib.h>
struct fun
{int area;
int high;
int x,y;
}a[90];
int cmp2(const void *a,const void *b)
{
return *(int *)b-*(int *)a;
}
int cmp(const void *a,const void *b)
{
struct fun *d=(struct fun *)a;
struct fun *c=(struct fun *)b;
if(c->area!=d->area)
return c->area-d->area;
else if(c->x!=d->x)
return c->x-d->x;
else if(c->y!=c->y)
return c->y-d->y;
}
int main()
{
int n,i,s,r,t,j=0,max[91],k,p=0;
while(scanf("%d",&n)&&n)
{
p++;
for(i=0;i<3*n;i=i+3)
{
scanf("%d%d%d",&s,&r,&t);
a[i].area=s*r;a[i].x=s;a[i].y=r;a[i].high=t;
a[i+1].area=s*t;a[i+1].x=s;a[i+1].y=t;a[i+1].high=r;
a[i+2].area=t*r;a[i+2].x=t;a[i+2].y=r;a[i+2].high=s;
} //输入矩形对应的长宽高,并且求出面积都放在结构题里面
for(i=0;i<3*n;i++)
qsort(&a[i].x,2,sizeof(a[i].x),cmp2); //对每个结构体数组中的地面的长宽进行降序排列
qsort(a,n*3,sizeof(struct fun),cmp); //针对面积进行降序排列
for(i=0;i<3*n;i++)
{
max[i]=a[i].high;//针对每一个面积记录下它的高
}
for(i=3*n-1;i>=0;i--)
{
k=0;
for(j=3*n-1;j>i;j--)//按照从低向高的遍历规则,这对i对j进行遍历,记录满足题意的最高值,然后再次加上到原来的高
{
if((a[i].x>a[j].x)&&(a[i].y>a[j].y)&&(k<max[j]))
k=max[j];
}
max[i]=max[i]+k;
}
k=0;
for(i=0;i<3*n;i++)//遍历找到最高值然后输出
if(k<max[i])
k=max[i];
printf("Case %d: maximum height = %d\n",p,k);
}
return 0;
}