1 条题解
-
0
这是一个博弈题,我们要找寻某一方必定获胜或者必定失败的情况(即必胜态和必败态)。
经过读题,很容易发现,kky是处于劣势的,因为kky需要不断选shuji选过的数字才能保持最终剩余的数字和shuji相同,所以我们可以考虑kky的必胜态是什么:
当shuji和kky的数组顺序一样时,shuji选哪一个kky就选跟他一样的从而获胜,因为两人都能从数组的两端选择,所以当shuji的数组顺序与kky的正好相反时(即shuji的第一个到第n个数字等于kky的第n个到第1个数字),kky依然可以选择和shuji相同的以获得胜利;
当上述两种情况均为出现时,shuji可以选择kky当前无法选择的一个数,而kky为了游戏进行,不得不选择一个shuji未选择的数x,此时shuji只要将这个x保留到最后即可获得胜利(
不愧是shuji)。综上所述,只有当两数组相同或互相相反时kky赢,其他情况均为shuji赢。
c代码:
#include<stdio.h> const int N = 3e5 + 5; int a[N], b[N]; int main() { int t; scanf("%d", &t); while (t--) { int n; scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); } for (int i = 1; i <= n; i++) { scanf("%d", &b[i]); } int flag1 = 1, flag2 = 1; for (int i = 1; i <= n; i++) { if (a[i] != b[i]) {//判断正序 flag1 = 0; } if (a[i] != b[n - i + 1]) {//判断逆序 flag2 = 0; } } if (flag1 || flag2) { printf("kky\n"); } else { printf("shuji\n"); } } return 0; }
c++代码,感兴趣可以学一下:
#include<bits/stdc++.h> #define int long long #define pii pair<int,int> #define endl '\n' using namespace std; const int mod = 1e9 + 7, inf = 1e18, N = 2e5 + 5; void solve() { int n; cin >> n; vector<int> a(n), b(n); for (int i = 0; i < n; i++) { cin >> a[i]; } for (int i = 0; i < n; i++) { cin >> b[i]; } if (a == b) { cout << "kky\n"; return ; } reverse(a.begin(), a.end());//翻转数组 if (a == b) { cout << "kky\n"; return ; } cout << "shuji\n"; } signed main() { ios::sync_with_stdio(false); cin.tie(nullptr),cout.tie(nullptr); int T = 1; cin >> T; while(T--) { solve(); } return 0; }
信息
- ID
- 1023
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 109
- 已通过
- 18
- 上传者