makrusak

1152

Nov 19th, 2012
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.60 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <string>
  6. #include <string.h>
  7. #include <queue>
  8. #include <map>
  9. #include <set>
  10. #include <cmath>
  11. #include <sstream>
  12. #include <stack>
  13. #include <cassert>
  14.  
  15. #define pb push_back
  16. #define mp make_pair
  17. #define PI 3.1415926535897932384626433832795
  18. #define sqr(x) (x)*(x)
  19. #define forn(i, n) for(int i = 0; i < n; ++i)
  20. #define ALL(x) x.begin(), x.end()
  21. #define F first
  22. #define S second
  23. #define m0(x) memset(x,0,sizeof(x))
  24. #define m1(x) memset(x,-1,sizeof(x))
  25. #define CC(x) cout << (x) << "\n"
  26. #define pw(x) (1ull<<(x))
  27. #define bit(m,n) ((m>>n)&1)
  28.  
  29. using namespace std;
  30. typedef long long ll;
  31. typedef unsigned long long ull;
  32. typedef long double ld;
  33. typedef pair<int,int> pii;
  34. const int INF = 2147483647;
  35. const ll LLINF = 9223372036854775807LL;
  36.  
  37. int n;
  38. int a[30];
  39. int m[pw(21)];
  40. int sum;
  41.  
  42. void dfs(int mask) {
  43.   if (m[mask] || sum==0) return;
  44.   int kill, cur;
  45.   m[mask]=INF;
  46.   int f1,f2,f3;
  47.   for (int i=0;i<n;i++) {
  48.     f1=i,f2=i+1,f3=i+2;
  49.     if (f2>=n) f2-=n;
  50.     if (f3>=n) f3-=n;
  51.     kill = 0;
  52.     if (!bit(mask,f1)) kill+=a[f1];
  53.     if (!bit(mask,f2)) kill+=a[f2];
  54.     if (!bit(mask,f3)) kill+=a[f3];
  55.     if (kill==0) continue;
  56.     sum-=kill;
  57.     cur = mask|pw(f1)|pw(f2)|pw(f3);
  58.     dfs(cur);
  59.     if (m[cur]+sum<m[mask]) m[mask]=m[cur]+sum;
  60.     sum+=kill;
  61.   }
  62. }
  63.  
  64. int main() {
  65.   //freopen("input.txt", "r", stdin);
  66.   //freopen("output.txt", "w", stdout);
  67.   scanf("%d", &n);
  68.   for (int i=0;i<n;i++) {
  69.     scanf("%d", &a[i]);
  70.     sum+=a[i];
  71.   }
  72.   dfs(0);
  73.   printf("%d\n", m[0]);
  74.   return 0;
  75. }
Advertisement
Add Comment
Please, Sign In to add comment