2 条题解
-
0
验题人做法
先删,必胜条件就是第一次删除自己左右端点处不等于 的左右端点处的值。
若 左右两边的值都和 左右两边的一样, 就只能退一步,看倒数第二的和正数第二的能和 一样不,假如都一样的,以此类推。
最后 没有找到不一样的删,那么 就赢了。
通俗的意思就是,如果一个数组和另一个数组相等或者反转后和另一个数组相等,那么 就输了。反之则必胜。
#include <bits/stdc++.h> using u32 = unsigned; using i64 = long long; using u64 = unsigned long long; using i128 = __int128; int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int n; std::cin >> n; std::vector<int> a(n), b(n), c(n); for (int i = 0; i < n; i++) { std::cin >> a[i]; } for (int i = 0; i < n; i++) { std::cin >> b[i]; } c = b; reverse(b.begin(), b.end()); if (a == b || a == c) { std::cout << "1\n"; } else { std::cout << "0\n"; } return 0; }
-
0
博弈。 先手,当 的左右两侧存在一个数,这个数不等于 的左右两侧任何一个数时, 可以删除这个数,然后 无法删除这个数,只能删除 两侧其中一个,记 删除这个数为 ,此时对 来说当前数字序列还保留着 , 内没有 ,即 可以保留 这个数,而最后一定不会和 剩下的 相等, 胜利。反之不存在这个数使得其不等于 两侧的任何一个数,即 两侧两个数,分别对应 两侧的两个数,则 可以通过后手删除 删除的数直到最后和 相等。
inline void solve() { int n; cin>>n; vector<int>a(n+3),b(n+3); for(int i=1;i<=n;i++)cin>>a[i]; for(int i=1;i<=n;i++)cin>>b[i]; int al=1,ar=n,bl=1,br=n; while(al<ar) { if(a[al]!=b[bl]&&a[al]!=b[br]){ cout<<"0"; return; } if(a[ar]!=b[bl]&&a[ar]!=b[br]){ cout<<"0"; return; } //当前检查一次 int sy=0; if(a[al]==b[bl]){ if(a[al+1]!=b[bl+1]&&a[al+1]!=b[br])sy=1; }else if(a[al]==b[br]){ if(a[al+1]!=b[br-1]&&a[al+1]!=b[bl])sy=1; } if(a[ar]==b[br]){ if(a[ar-1]!=b[br-1]&&a[ar-1]!=b[bl])sy=1; }else if(a[ar]==b[bl]){ if(a[ar-1]!=b[bl+1]&&a[ar-1]!=b[br])sy=1; } if(sy){ cout<<"0"; return; } //一次删两个数,分别检查左右是否存在删除这边时,下一个就是num if(a[al]==b[bl]){ al++,bl++; }else if(a[al]==b[br]){ al++,br--; } if(a[ar]==b[br]){ ar--,br--; }else if(a[ar]==b[bl]){ ar--,bl++; } } cout<<"1"; }
- 1
信息
- ID
- 56
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 40
- 已通过
- 11
- 上传者