小刀和大刀是双胞胎兄弟。今天他们玩一个有意思的游戏。 大刀给小刀准备了一个长度为n的整数序列。小刀试着把这个序列分解成两个长度为n/2的子序列。
这两个子序列必须满足以下两个条件:
1.他们不能相互重叠。
2.他们要完全一样。
如果小刀可以分解成功,大刀会给小刀一些糖果。
然而这个问题对于小刀来说太难了。他想请你来帮忙。
Input
第一行给出一个T,表示T组数据。(1<=T<=5) 接下来每一组数据,输入共2行。 第一行包含一个整数n (2<=n<=40且为偶数)。 第二行给出n个整数a[0],a[1],a[2],…,a[n-1]表示大刀给小刀准备的序列。(-1,000,000,000<=a[i]<=1,000,000,000)
Output
如果小刀可以完成游戏,输出"Good job!!" (不包含引号),否则 输出"What a pity!" (不包含引号)。
Input示例
2 4 1 1 2 2 6 1 2 3 4 5 6
Output示例
Good job!! What a pity!#include <iostream> #include <cstring> using namespace std; int input[40]; int a[40]; int b[40]; void fun(int n, int i, int j, int p, bool &flag) { if (flag) { return; } if (i < (n/2)-1) { i++; a[i] = input[p]; p++; if (i <= j) { if (a[i] == b[i]) { if (p == n) { flag = true; return; } fun(n, i, j, p, flag); } } else { fun(n, i, j, p, flag); } i--; p--; } if (j < (n/2)-1) { j++; b[j] = input[p]; p++; if (j <= i) { if (a[j] != b[j]) { return; } else if (p == n) { flag = true; return; } } fun(n, i, j, p, flag); } } int main() { int t; cin >> t; int n; for (int i = 0; i < t; i++) { cin >> n; for (int j = 0; j < n; j++) { cin >> input[j]; } bool flag = false; fun(n, -1, -1, 0, flag); if (flag) { cout << "Good job!!" << endl; } else { cout << "What a pity!" << endl; } } return 0; }