makrusak

1152-ans

Nov 19th, 2012
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.68 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. int ans=INF;
  42.  
  43. void dfs(int mask, int now) {
  44. if (sum==0) {
  45. if (now<ans) ans=now;
  46. return;
  47. }
  48. if (now>=ans) return;
  49. if (m[mask]!=0 && now>=m[mask]) return;
  50. m[mask]=now;
  51. int kill, cur;
  52. int f1,f2,f3;
  53. for (int i=0;i<n;i++) {
  54. f1=i,f2=i+1,f3=i+2;
  55. if (f2>=n) f2-=n;
  56. if (f3>=n) f3-=n;
  57. kill = 0;
  58. if (!bit(mask,f1)) kill+=a[f1];
  59. if (!bit(mask,f2)) kill+=a[f2];
  60. if (!bit(mask,f3)) kill+=a[f3];
  61. if (kill==0) continue;
  62. sum-=kill;
  63. cur = mask|pw(f1)|pw(f2)|pw(f3);
  64. dfs(cur,now+sum);
  65. sum+=kill;
  66. }
  67. }
  68.  
  69. int main() {
  70. //freopen("input.txt", "r", stdin);
  71. //freopen("output.txt", "w", stdout);
  72. scanf("%d", &n);
  73. for (int i=0;i<n;i++) {
  74. scanf("%d", &a[i]);
  75. sum+=a[i];
  76. }
  77. dfs(0,0);
  78. printf("%d\n", ans);
  79. return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment