Advertisement
Guest User

Untitled

a guest
Mar 24th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.83 KB | None | 0 0
  1. #pragma comment(linker,"/STACK:64000000")
  2. #include <stdio.h>
  3. #include <iostream>
  4. #define _USE_MATH_DEFINES
  5. #include <math.h>
  6. #include <stdlib.h>
  7. #include <ctype.h>
  8. #include <string.h>
  9. #include <algorithm>
  10. #include <vector>
  11. #include <set>
  12. #include <map>
  13. #include <queue>
  14. #include <string>
  15.  
  16. using namespace std;
  17.  
  18. #define mp make_pair
  19. #define pb push_back
  20. #define eps (double)(1e-9)
  21. #define MOD (int)(1e9+7)
  22.  
  23. typedef long long ll;
  24. typedef unsigned long long ull;
  25.  
  26. int ans[(int)(1 << 20)];
  27. int beat[(int)(1 << 20)];
  28. int a[20];
  29. vector<vector<int>> Sc(21);
  30. int bit(int x)
  31. {
  32.     int res = 0;
  33.     while (x)
  34.     {
  35.         res++;
  36.         x &= x - 1;
  37.     }
  38.     return res;
  39. }
  40. int for_beat(int n, int x)
  41. {
  42.     int res = 0;
  43.     int j = 0;
  44.     while (j < n)
  45.     {
  46.         if (x & 1)
  47.             res += a[j];
  48.         x >>= 1;
  49.         j++;
  50.     }
  51.     return res;
  52. }
  53. vector<int> st;
  54. vector<int> hod;
  55. int main()
  56. {
  57. #ifdef _DEBUG
  58.     freopen("input.txt", "rt", stdin);
  59.     freopen("output.txt", "wt", stdout);
  60. #endif
  61.     int n, i, j;
  62.     scanf("%d", &n);
  63.     for (i = 0; i < n; ++i)
  64.         scanf("%d", &a[i]);
  65.     j = 1;
  66.     for (i = 0; i < 25; ++i)
  67.     {
  68.         st.pb(j);
  69.         j *= 2;
  70.     }
  71.     int lg = st[n];
  72.     memset(ans, -1, sizeof(ans[0])*lg);
  73.     ans[0] = 0;
  74.     j = 0;
  75.     j = st[0] | st[1] | st[n - 1];
  76.     hod.pb(j);
  77.     j = st[0] | st[n - 1] | st[n - 2];
  78.     hod.pb(j);
  79.     j = st[0] | st[1] | st[2];
  80.     for (i = 1; i < n - 1; ++i)
  81.     {
  82.         hod.pb(j);
  83.         j <<= 1;
  84.     }
  85.     for (i = 0; i < n; ++i)
  86.         ans[st[i]] = 0;
  87.     for (i = 1; i < lg; ++i)
  88.     {
  89.         j = bit(i);
  90.         Sc[j].pb(i);
  91.         beat[i] = for_beat(n, i);
  92.     }
  93.     for (int level = 2; level <= n; ++level)
  94.     {
  95.         for (i = 0; i < Sc[level].size(); ++i)
  96.         {
  97.             int mn = (int)(1e9);
  98.             for (j = 0; j < n; ++j)
  99.             {
  100.                 int k = Sc[level][i] & (~hod[j]);
  101.                 if (ans[k] != -1)
  102.                     mn = min(mn, beat[k] + ans[k]);
  103.             }
  104.             ans[Sc[level][i]] = mn;
  105.         }
  106.     }
  107.     printf("%d", ans[lg - 1]);
  108.     return 0;
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement