首页 > 代码库 > BestCoder22 1002.NPY and arithmetic progression(hdu 5143) 解题报告
BestCoder22 1002.NPY and arithmetic progression(hdu 5143) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5143
题目意思:给出 1, 2, 3, 4 的数量,分别为a1, a2, a3, a4,问是否在每个数只使用一次的前提下,分成若干部分,每部分数的长度 >= 3且满足是等差数列。可以的话输出 Yes ,否则 No 。
比赛的时候过了pretest,那个开心啊~~然后跟 XX 兽讨论了之后,才发现自己理解错了题目= =
要用到深搜,问组合嘛~~组合就是有可能是(1, 2, 3, 4)、(1, 2, 3)、(2, 3, 4) 与 cnt[1] >= 3 || cnt[1] == 0 { (1, 1, 1), (0)} ,cnt[2] >= 3 || cnt[2] == 0,cnt[3] >= 3 || cnt[3] == 0, cnt[4] >= 3 || cnt[4] == 0 的组合。
cnt[i] 表示数字 i 的数量有cnt[i]个。其实总共有16种情况。
0 0 0 0, 0 0 0 3, 0 0 3 0, 0 0 3 3
0 3 0 0, 0 3 0 3, 0 3 3 0, 0 3 3 3
3 0 0 0, 3 0 0 3, 3 0 3 0, 3 0 3 3
3 3 0 0, 3 3 0 3, 3 3 3 0, 3 3 3 3
注意:填 3 的那些位置实际上 >= 3 都符合条件的。然后跟(1, 2, 3, 4)、(1, 2, 3)、(2, 3, 4) 组合
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 using namespace std; 6 7 bool dfs(int a, int b, int c, int d) 8 { 9 if ((a >= 3 || !a) && (b >= 3 || !b) && (c >= 3 || !c) && (d >= 3 || !d))// (1,1,1),(2,2,2), (3,3,3), (4,4,4) 的组合10 return true;11 if (a >= 1 && b >= 1 && c >= 1 && d >= 1) // (1, 2, 3, 4)12 {13 if (dfs(a-1, b-1, c-1, d-1))14 return true;15 }16 if (a >= 1 && b >= 1 && c >= 1) // (1, 2, 3)17 {18 if (dfs(a-1, b-1, c-1, d))19 return true;20 }21 if (b >= 1 && c >= 1 && d >= 1) // (2, 3, 4)22 {23 if (dfs(a, b-1, c-1, d-1))24 return true;25 }26 return false;27 }28 29 int main()30 {31 #ifndef ONLINE_JUDGE32 freopen("in.txt", "r", stdin);33 #endif // ONLINE_JUDGE34 int T, ta, tb, tc, td;35 while (scanf("%d", &T) != EOF)36 {37 while (T--)38 {39 scanf("%d%d%d%d", &ta, &tb, &tc, &td);40 printf("%s\n", dfs(ta, tb, tc, td) ? "Yes" : "No");41 }42 return 0;43 }44 }
BestCoder22 1002.NPY and arithmetic progression(hdu 5143) 解题报告