giabinh

TheTowerOfBabylon

Nov 17th, 2015
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.89 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define fto(i, l, r) for (int i=l; i<=r; ++i)
  4.  
  5. using namespace std;
  6.  
  7. int n, test = 0, x[1000], y[1000], z[1000], h[1000];
  8.  
  9. void _qsort(int l, int r) {
  10.     if (l >= r) return;
  11.     int i = l, j = r,
  12.         mx = x[(l + r) / 2], my = y[(l + r) / 2], mz = z[(l + r) / 2];
  13.  
  14.     while (i <= j)
  15.     {
  16.         while (x[i] > mx || (x[i] == mx && y[i] > my) || (x[i] == mx && y[i] == my && z[i] > mz)) ++i;
  17.         while (x[j] < mx || (x[j] == mx && y[j] < my) || (x[j] == mx && y[j] == my && z[j] < mz)) --j;
  18.         if (i <= j)
  19.         {
  20.             swap(x[i], x[j]);
  21.             swap(y[i], y[j]);
  22.             swap(z[i], z[j]);
  23.             ++i; --j;
  24.         }
  25.     }
  26.     _qsort(i, r); _qsort(l, j);
  27. }
  28.  
  29. int main() {
  30.     #ifndef ONLINE_JUDGE
  31.         freopen("uva437.inp", "r", stdin);
  32.     #endif // ONLINE_JUDGE
  33.  
  34.  
  35.     while (scanf("%d", &n) && n)
  36.     {
  37.         ++test;
  38.         fto (i, 0, n-1)
  39.         {
  40.             scanf("%d%d%d", &x[i], &y[i], &z[i]);
  41.             if (x[i] > y[i]) swap(x[i], y[i]);
  42.  
  43.             x[n + i] = x[i]; y[n + i] = y[i]; z[n + i] = z[i];
  44.             swap(x[n + i], z[n + i]);
  45.             if (x[n + i] > y[n + 1]) swap(x[n + 1], y[n + 1]);
  46.  
  47.             x[2*n + i] = x[i]; y[2*n + i] = y[i]; z[2*n + i] = z[i];
  48.             swap(y[2*n + i], z[2*n + i]);
  49.             if (x[2*n + i] > y[2*n + i]) swap(x[2*n + i], y[2*n + i]);
  50.         }
  51.         _qsort(0, 3*n - 1);
  52.  
  53.         //fto(i, 0, 3*n - 1) cout << x[i] << " " << y[i] << " " << z[i] << endl;
  54.  
  55.         fto(i, 0, 3*n - 1) h[i] = z[i];
  56.  
  57.         fto(i, 0, 3*n - 1)
  58.             fto(j, 0, i - 1)
  59.                 if ((x[i] < x[j] && y[i] < y[j]) ||
  60.                     (x[i] < y[j] && y[i] < x[j])) h[i] = max(h[i], h[j] + z[i]);
  61.  
  62.        int ans = 0;
  63.        fto(i, 0, 3*n - 1) ans = max(ans, h[i]);
  64.  
  65.         printf("Case %d: maximum height = %d\n", test, ans);
  66.     }
  67.  
  68.     return 0;
  69. }
Advertisement
Add Comment
Please, Sign In to add comment