// UVa 437 - The Tower of Babylon
#include <iostream>
#include <vector>
#include <algorithm>
#include <stdio.h>
using namespace std;
#define datatype unsigned long long int
struct triad {
datatype x, y, z;
};
bool operator <(triad a, triad b) {
return a.x < b.x || a.x == b.x && a.y < b.y || a.x == b.x && a.y == b.y && a.z < b.z || a.x == b.x && a.y == b.y && a.z == b.z;
}
int main() {
int t = 0;
int n;
cin >> n;
while (n) {
t++;
triad a[30];
for (int i = 0; i < n; i++) {
datatype x, y, z;
cin >> x >> y >> z;
a[i].x = min(min(x, y), z);
a[i].z = max(max(x, y), z);
a[i].y = x + y + z - a[i].x - a[i].z;
}
sort(a, a + n);
triad b[90];
int j = 0;
for (int i = 0; i < n; i++) {
b[j].x = a[i].x;
b[j].y = a[i].y;
b[j].z = a[i].z;
j++;
b[j].x = a[i].y;
b[j].y = a[i].z;
b[j].z = a[i].x;
j++;
b[j].x = a[i].x;
b[j].y = a[i].z;
b[j].z = a[i].y;
j++;
}
n *= 3;
sort(b, b + n);
datatype sol = 0;
datatype T[90];
for (int i = 0; i < n; i++) {
T[i] = 0;
for (int j = 0; j < i; j++)
if (b[j].x < b[i].x && b[j].y < b[i].y && T[j] > T[i]) {
T[i] = T[j];
}
T[i] += b[i].z;
if (T[i] > sol)
sol = T[i];
}
printf("Case %d: maximum height = %llu\n", t, sol);
cin >> n;
}
return 0;
}
Sunday, June 7, 2015
UVa 437 - The Tower of Babylon
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment