题目链接: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_JUDGE 32 freopen("in.txt", "r", stdin); 33 #endif // ONLINE_JUDGE 34 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 ", dfs(ta, tb, tc, td) ? "Yes" : "No"); 41 } 42 return 0; 43 } 44 }