Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma comment(linker,"/STACK:64000000")
- #include <stdio.h>
- #include <iostream>
- #define _USE_MATH_DEFINES
- #include <math.h>
- #include <stdlib.h>
- #include <ctype.h>
- #include <string.h>
- #include <algorithm>
- #include <vector>
- #include <set>
- #include <map>
- #include <queue>
- #include <string>
- using namespace std;
- #define mp make_pair
- #define pb push_back
- #define eps (double)(1e-9)
- #define MOD (int)(1e9+7)
- typedef long long ll;
- typedef unsigned long long ull;
- int ans[(int)(1 << 20)];
- int beat[(int)(1 << 20)];
- int a[20];
- vector<vector<int>> Sc(21);
- int bit(int x)
- {
- int res = 0;
- while (x)
- {
- res++;
- x &= x - 1;
- }
- return res;
- }
- int for_beat(int n, int x)
- {
- int res = 0;
- int j = 0;
- while (j < n)
- {
- if (x & 1)
- res += a[j];
- x >>= 1;
- j++;
- }
- return res;
- }
- vector<int> st;
- vector<int> hod;
- int main()
- {
- #ifdef _DEBUG
- freopen("input.txt", "rt", stdin);
- freopen("output.txt", "wt", stdout);
- #endif
- int n, i, j;
- scanf("%d", &n);
- for (i = 0; i < n; ++i)
- scanf("%d", &a[i]);
- j = 1;
- for (i = 0; i < 25; ++i)
- {
- st.pb(j);
- j *= 2;
- }
- int lg = st[n];
- memset(ans, -1, sizeof(ans[0])*lg);
- ans[0] = 0;
- j = 0;
- j = st[0] | st[1] | st[n - 1];
- hod.pb(j);
- j = st[0] | st[n - 1] | st[n - 2];
- hod.pb(j);
- j = st[0] | st[1] | st[2];
- for (i = 1; i < n - 1; ++i)
- {
- hod.pb(j);
- j <<= 1;
- }
- for (i = 0; i < n; ++i)
- ans[st[i]] = 0;
- for (i = 1; i < lg; ++i)
- {
- j = bit(i);
- Sc[j].pb(i);
- beat[i] = for_beat(n, i);
- }
- for (int level = 2; level <= n; ++level)
- {
- for (i = 0; i < Sc[level].size(); ++i)
- {
- int mn = (int)(1e9);
- for (j = 0; j < n; ++j)
- {
- int k = Sc[level][i] & (~hod[j]);
- if (ans[k] != -1)
- mn = min(mn, beat[k] + ans[k]);
- }
- ans[Sc[level][i]] = mn;
- }
- }
- printf("%d", ans[lg - 1]);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement