Advertisement
Guest User

OpenCup :: Stage 5 - GP of Two Mountain Systems :: Problem A

a guest
May 6th, 2012
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.32 KB | None | 0 0
  1. #include <algorithm>
  2. #include <cstdio>
  3. #include <memory.h>
  4.  
  5. using namespace std;
  6.  
  7. #define fill(a, x) memset (a, x, sizeof(a))
  8.  
  9. int n, s, a[111111], l, r, ans, rr[111111], cc;
  10. bool w[111111], pp;
  11.  
  12. int main() {
  13.     scanf("%d %d", &n, &s);
  14.     for (int i = 0; i < n; ++i)
  15.         scanf("%d", a + i);
  16.     sort(a, a + n);
  17.     reverse(a, a + n);
  18.     l = 0;
  19.     r = n - 1;
  20.     ans = 0;
  21.     cc = 0;
  22.     fill(w, 0);
  23.     while (a[l] == s) {
  24.         w[l] = true;
  25.         rr[cc++] = a[l++];
  26.         ++ans;
  27.     }
  28.     while (r > l) {
  29.         while (r > l && a[l] + a[r] <= s) --r;
  30.         if (r == l) break;
  31.         rr[cc++] = a[r];
  32.         w[r] = true;
  33.         rr[cc++] = a[l];
  34.         w[l] = true;
  35.         --r;
  36.         ++l;
  37.         ans += 2;
  38.     }
  39.     pp = false;
  40.     for (int i = 0; i < n; ++i)
  41.         if (!w[i]) {
  42.             rr[cc++] = a[i];
  43.             if (pp) {
  44.                 ++ans;
  45.                 pp = false;
  46.             } else pp = true;
  47.         }
  48.     ans = 0;
  49.     pp = false;
  50.     for (int i = 0; i < n; ++i) {
  51.         if (pp)
  52.             if (rr[i - 1] + rr[i] > s) ++ans; else {
  53.                 ++ans;
  54.                 pp = false;
  55.             }
  56.         else pp = true;
  57.     }
  58.     ans += pp;
  59.     printf("%d\n", ans);
  60.     for (int i = 0; i < n; ++i)
  61.         printf("%d ", rr[i]);
  62.     return 0;
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement