UVA 437 - The Tower of Babylon

这道题以前写过,首先block可以摆成三种形式,要求堆在它上面的木块的长和宽都比它小,所以

我先将木块根据长的一级升序,宽的二级升序排序,然后枚举一遍在一块木块上可以堆的高度,

选择最高的加上,最后找到一个最大高度。

#include<stdio.h>
#include<stdlib.h>
#define MAXD 100

typedef struct a
{
int x, y, z;
}S;
S d[MAXD];
int N, maxh;

int cmp( const void *_p, const void *_q)
{
S *p = (S *)_p;
S *q = (S *)_q;
if( p->x == q->x)
return p->y - q->y;
return p->x - q->x;
}

void init()
{
int a, b, c, a1, b1, c1;
for( int i = 1; i <= N * 3; i += 3)
{
scanf( "%d%d%d", &a, &b, &c);
//a1为最小值,c1为最大值
a1 = a; if( a1 > b) a1 = b; if( a1 > c) a1 = c;
c1 = a; if( c1 < b) c1 = b; if( c1 < c) c1 = c;
b1 = a + b + c - a1 - c1;

d[i].x = c1, d[i].y = b1, d[i].z = a1;
d[i+1].x = c1, d[i+1].y = a1, d[i+1].z = b1;
d[i+2].x = b1, d[i+2].y = a1, d[i+2].z = c1;
}
d[0].x = d[0].y = d[0].z = 0;
qsort( d, N *3 + 1, sizeof d[0], cmp);
}

void dp()
{
for( int i = 0; i <= N * 3; i ++)
{
maxh = 0;
for( int j = 0; j < i; j ++)
{
if( d[i].x > d[j].x && d[i].y > d[j].y && d[j].z > maxh)
maxh = d[j].z;
}
d[i].z += maxh;
}
maxh = 0;
for( int i = 0; i <= N * 3; i ++)
if( maxh < d[i].z)
maxh = d[i].z;
}

int main()
{
int cas = 0;
while( scanf( "%d", &N), N)
{
init();
dp();
printf( "Case %d: maximum height = %d\n", ++ cas, maxh);
}
return 0;
}

 

你可能感兴趣的:(uva)