【 2013 Multi-University Training Contest 6 】
2013-08-13 11:25
411 查看
HDU 4655 Cut Pieces
假设n个数构成的总数都分成了n段,总数是n*a1*a2*...*an。但是答案显然不会那么多。
对于相邻的两个ai,ai+1,如果选择相同的颜色,那么就减少了a1*a2*...*ai-1*min(ai,ai+1)*ai+2*ai+3*...*an。
不妨假设n=3,三个数分别是a,b,c。且a<b<c。
对于所有的排列,只有a,c,b是最优的,结果是3*a*b*c-a*b-b。
当n>3的时候同样可以得到结论:a1,an,a2,an-1...使得总的段数最多。
View Code
假设n个数构成的总数都分成了n段,总数是n*a1*a2*...*an。但是答案显然不会那么多。
对于相邻的两个ai,ai+1,如果选择相同的颜色,那么就减少了a1*a2*...*ai-1*min(ai,ai+1)*ai+2*ai+3*...*an。
不妨假设n=3,三个数分别是a,b,c。且a<b<c。
对于所有的排列,只有a,c,b是最优的,结果是3*a*b*c-a*b-b。
当n>3的时候同样可以得到结论:a1,an,a2,an-1...使得总的段数最多。
#include<cstdio> #include<cstring> #include<vector> #define MAXN 2010 using namespace std; int arr[MAXN]; char str[MAXN]; bool flag; int idx[MAXN]; int cnt[MAXN]; int st[2][MAXN]; int belong[MAXN]; int n; vector<int> pos[MAXN]; void dfs(int x, int p1, int p2) { if (x > n) { flag = true; } if (flag) { return; } if (p1 > 0 && p2 > 0 && arr[st[0][min(p1, p2)]] != arr[st[1][min(p1, p2)]]) { return; } if (belong[x] == 0) { st[0][p1 + 1] = x; dfs(x + 1, p1 + 1, p2); } else if (belong[x] == 1) { st[1][p2 + 1] = x; dfs(x + 1, p1, p2 + 1); } else { st[0][p1 + 1] = x; belong[pos[arr[x]][2]] = 1; dfs(x + 1, p1 + 1, p2); if (!flag) { st[1][p2 + 1] = x; belong[pos[arr[x]][2]] = 0; dfs(x + 1, p1, p2 + 1); belong[pos[arr[x]][2]] = -1; } } } int main() { int T; int i; scanf("%d", &T); while (T--) { scanf("%d", &n); memset(idx, 0, sizeof(idx)); memset(cnt, 0, sizeof(cnt)); for (i = 1; i <= n; i++) { scanf("%d", &arr[i]); cnt[arr[i]]++; idx[i] = cnt[arr[i]]; pos[arr[i]].clear(); } memset(belong, -1, sizeof(belong)); for (i = 1; i <= n; i++) { if (idx[i] == 1) { belong[i] = 0; } else if (idx[i] == 2 && cnt[arr[i]] == 2) { belong[i] = 1; } else if (idx[i] == 4) { belong[i] = 1; } pos[arr[i]].push_back(i); } flag = false; dfs(1, 0, 0); for (i = 1; i <= (n >> 1); i++) { str[st[0][i]] = '0'; str[st[1][i]] = '1'; } for (i = 1; i <= n; i++) { putchar(str[i]); } putchar('\n'); } return 0; }
View Code
相关文章推荐
- 2013 Multi-University Training Contest 1
- 2013 Multi-University Training Contest 1
- 2013 Multi-University Training Contest 2
- 2013 Multi-University Training Contest 1 (hdu 4601 hdu 4603)
- 2013 Multi-University Training Contest 6 解题报告(更新中)
- 2013 Multi-University Training Contest 7
- 2013 Multi-University Training Contest 8 小结
- 2013 Multi-University Training Contest 8 解题报告(更新中)
- 2013 Multi-University Training Contest 1 Occupy Cities HDU 4606
- 2013 Multi-University Training Contest 1
- 2013 Multi-University Training Contest 8
- hdu 4619 匈牙利算法 求最大匹配 2013 Multi-University Training Contest 2
- 2013 Multi-University Training Contest 1 I-number 大数
- 2013 Multi-University Training Contest 1 Warm up HDU 4612
- 2013 Multi-University Training Contest 4 Who's Aunt Zhang
- [置顶] 2013 Multi-University Training Contest 8
- 2013 Multi-University Training Contest 10 解题报告(更新中)
- Integer Partition(hdu4658)2013 Multi-University Training Contest 6 整数拆分二
- 2013 Multi-University Training Contest 1 Partition
- 2013 Multi-University Training Contest 5