//解题思路:每一个立方体必然有 3 个面积,所以 N 种类型的立方体,必然有 3 * N 个面积组合
//将所有的面积从小到大排列之后,每组面积必然对应一个高的值,依据题意,要使高之和最大,所
//以这个问题就转化成了求最长子列和的最大值
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <string.h>
4
5
//定义一个结构体存立方体的面积 和 边长
6
struct cube
7

{
8
int x;
9
int y;
10
int z;
11
int area;
12
}b[200]; //结构体变量
13
14
//这是调用qsort 函数时必须要用的
15
int compare(const void* a,const void* b)
16

{
17
return (*(cube *)a).area-(*(cube *)b).area; //如果 < 则返回负数 如果 = 则返回0 如果 > 则返回 1
18
}
19
20
// 判断上面的两条边都要 < 下面的两条边
21
int com (cube a, cube b)
22


{
23
if ( (a.x < b.x && a.y < b.y) || (a.y < b.x && a.x < b.y) ) 如:10 20 与 40 50
24

return 1;
25
26

else
27

return 0;
28

}
29
30
int main ()
31

{
32
int sum[200];
33
34
//用来控制下标的
35
int dir[3][3] =
{
{0, 1, 2},
{0, 2, 1},
{1, 2, 0} };
36
37
int n;
38
int a[3];
39
int count = 0;
40
while (scanf ("%d", &n))
41
{
42
if (!n)
43
break;
44
int num = 0;
45
memset (sum, 0, sizeof (sum));
46
for (int i = 0; i < n; i ++)
47
{
48
scanf ("%d%d%d", &a[0], &a[1], &a[2]); //读入输入的三个数据
49
50
for (int j = 0; j < 3; j ++) //将所有可能的 立方体构成 存入到数组 b 中
51
{
52
b[num].x = a[ dir[j][0] ];
53
b[num].y = a[ dir[j][1] ];
54
b[num].z = a[ dir[j][2] ];
55
b[num].area = b[num].x * b[num].y;
56
num ++; //错点
57
}
58
59
}
60
61
//对 b 数组按面积进行快速排序
62
qsort (b, n * 3, sizeof (b[0]), compare);
63
64
/**//*
65
测试排序是否正确
66
for (int i = 0; i < 3 * n; i ++)
67
{
68
printf ("%d\t%d\t%d\t%d\n",b[i].x, b[i].y, b[i].z, b[i].area);
69
}*/
70
71
//在满足题目条件:上面的两条边都要 < 下面的两条边的情况下找到最大的高的和
72
sum[0] = b[0].z;
73
for (int i = 1; i < 3 * n; i++)
74
{
75
int temp = 0;
76
for (int j = 0; j < i; j ++)
77
{
78
if ( sum[j] > temp && ( com(b[j],b[i]) ) ) //要比较的高的值 满足题目的条件 累加求和
79
{
80
temp = sum[j];
81
}
82
}
83
sum[i] = temp + b[i].z;
84
85
//printf ("%d\t",sum[i]);
86
}
87
88
//printf ("\n");
89
90
//输出高的和
91
int max = -1;
92
for (int i = 0; i < 3 * n; i ++)
93
{
94
if (max < sum[i])
95
max = sum[i];
96
}
97
98
printf ("Case %d: maximum height = %d\n", ++count , max);
99
100
}
101
102
return 0;
103
}
104
posted on 2010-08-16 10:03
雪黛依梦 阅读(714)
评论(0) 编辑 收藏 引用 所属分类:
背包----贪心、回溯、分支界限