Advertisement
aropan

Northern Grand Prix 2011. Elections (Division 1 Only!)

Sep 26th, 2011
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.54 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cmath>
  3.  
  4. using namespace std;
  5.  
  6.  
  7. const int MAXN = 11;
  8. const int MAXS = 55;
  9. const int MAXA = 111;
  10. const long long INF = (long long)1e+15;
  11.  
  12. int n, s;
  13. int a[MAXN][MAXA];
  14. int v[MAXN];
  15. int upd[MAXA], cnt;
  16. long long V;
  17.  
  18. long long f[MAXN][MAXS][MAXA][MAXA];
  19. int p[MAXN][MAXS][MAXA][MAXA];
  20.  
  21.  
  22. long long abs(long long x)
  23. {
  24.     return x < 0? -x : x;
  25. }
  26.  
  27. int rec(int i, int j, int k, int l)
  28. {
  29.     if (i == 0) return 0;
  30.  
  31.     int x = p[i][j][k][l];
  32.     rec(i - 1, j - a[i - 1][x], k - x, l);
  33.  
  34.     printf("%d\n", x);
  35.     return 0;
  36. }
  37.  
  38. int main()
  39. {
  40.     freopen("elections.in", "r", stdin);
  41.     freopen("elections.out", "w", stdout);
  42.  
  43.     cnt = V = 0;
  44.  
  45.     scanf("%d %d", &n, &s);
  46.     for (int i = 0; i < n; i++)
  47.     {
  48.         cnt++;
  49.  
  50.         scanf("%d", &v[i]);
  51.         V += v[i];
  52.  
  53.         int m;
  54.         scanf("%d", &m);
  55.         for (int j = 0; j < m; j++)
  56.         {
  57.             int x;
  58.             scanf("%d", &x);
  59.             if (x < MAXA) upd[x] = cnt;
  60.         }
  61.  
  62.         for (int j = 1; j < MAXA; j++)      
  63.             a[i][j] = a[i][j - 1] + (upd[j] != cnt);
  64. /*
  65.         for (int j = 0; j < MAXA; j++)
  66.             printf("%d ", a[i][j]);
  67.         printf("\n");
  68. //*/
  69.     }
  70.  
  71.     for (int i = 0; i <= n; i++)
  72.         for (int j = 0; j <= s; j++)
  73.             for (int k = 0; k < MAXA; k++)
  74.                 for (int l = 0; l < MAXA; l++)
  75.                     f[i][j][k][l] = INF;
  76.  
  77.     for (int i = 0; i < MAXA; i++)
  78.         f[0][0][0][i] = 0;
  79.        
  80.     for (int i = 0; i < n; i++)
  81.         for (int j = 0; j <= s; j++)
  82.             for (int k = 0; k < MAXA; k++)
  83.                 for (int l = 0; l < MAXA; l++)
  84.                     if (f[i][j][k][l] < INF)
  85.                     {
  86.                         for (int x = 0; j + a[i][x] <= s && k + x < MAXA ; x++)
  87.                         {
  88.                             int I = i + 1;
  89.                             int J = j + a[i][x];
  90.                             int K = k + x;
  91.                             int L = l;
  92.  
  93.                             long long value = abs(x * V - v[i] * L);
  94.  
  95.                             if (f[I][J][K][L] >= f[i][j][k][l] + value)
  96.                             {
  97.                                 f[I][J][K][L] = f[i][j][k][l] + value;
  98.                                 p[I][J][K][L] = x;
  99.                             }
  100.                         }
  101.                     }
  102.  
  103.     int x = 1;
  104.     for (int i = 1; i < MAXA; i++)
  105.         if (f[n][s][i][i] * x < f[n][s][x][x] * i)
  106.             x = i;
  107.  
  108.     rec(n, s, x, x);
  109.     return 0;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement