Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<set>
- #include<vector>
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- using namespace std;
- const int M = 11;
- int n, m, a[M];
- vector<vector<int> > nst;
- vector<int> tmp;
- set<pair<vector<int>, vector<int> > > mem;
- void go(vector<int> &cst, int b, int s) {
- vector<vector<int> > st;
- vector<int> init;
- init.push_back(b);
- init.push_back(s);
- st.push_back(init);
- vector<int> bak = cst;
- reverse(bak.begin(), bak.end());
- for (int i = 0; i < (int)cst.size(); ++i) {
- vector<vector<int> > nst;
- bak.pop_back();
- for (int j = 0; j < (int)st.size(); ++j) {
- if (j && st[j] == st[j - 1]) {
- continue;
- }
- vector<int> tmp = st[j];
- if (mem.count(make_pair(tmp, bak))) {
- continue;
- }
- mem.insert(make_pair(tmp, bak));
- int b = tmp[tmp.size() - 2],
- s = tmp[tmp.size() - 1];
- tmp.pop_back(), tmp.pop_back();
- for (int k = max(0, cst[i] - s); k <= (int)cst[i] && k <= b; ++k) {
- vector<int> ntmp = tmp;
- if (k == 0 || k == cst[i]) {
- ntmp.push_back(cst[i]);
- } else {
- ntmp.push_back(k);
- ntmp.push_back(cst[i] - k);
- }
- sort(ntmp.begin(), ntmp.end());
- ntmp.push_back(b - k);
- ntmp.push_back(s - (cst[i] - k));
- nst.push_back(ntmp);
- }
- }
- sort(nst.begin(), nst.end());
- st = nst;
- }
- for (int i = 0; i < (int)st.size(); ++i) {
- if (i && st[i] == st[i - 1]) {
- continue;
- }
- vector<int> tmp = st[i];
- tmp.pop_back();
- tmp.pop_back();
- nst.push_back(tmp);
- }
- }
- int main() {
- scanf("%d%d", &n, &m);
- for (int i = 0; i < m; ++i) {
- scanf("%d", a + i);
- }
- vector<vector<int> > st;
- vector<int> init;
- init.push_back(n);
- st.push_back(init);
- for (int i = 0; i < m; ++i) {
- mem.clear();
- cout << i << ' ' << st.size() << endl;
- for (int j = 0; j < (int)st.size(); ++j) {
- if (j && st[j] == st[j - 1]) {
- continue;
- }
- go(st[j], a[i], n - a[i]);
- }
- sort(nst.begin(), nst.end());
- st = nst;
- nst.clear();
- }
- int ans = 0;
- for (int i = 0; i < (int)st.size(); ++i) {
- int cnt = 0;
- for (int j = 0; j < (int)st[i].size(); ++j) {
- if (st[i][j] == 1) {
- ++cnt;
- }
- }
- ans = max(ans, cnt);
- }
- printf("%d\n", ans);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement