Codeforces Round #770(Div.2) [A~D]
链接:contest link
A.Reverse and Concatenate
题目
给定一个长度为 的字符串 和一个整数 ,用 表示将字符串 反转,你可以对 执行 次如下操作:
- 将 变为
- 将 变为
求可以得到多少个不同的字符串
分析
如果 是回文串,那么无论执行哪种操作得到的结果都是一样的,所以执行 次操作后得到的不同字符串数为
如果 不是回文串,那么 时显然答案为 , 时,第一次操作可以将产生两个不同的回文串,根据上面对于回文串的讨论,答案为
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
while(t--) {
int n, k;
cin >> n >> k;
string s;
cin >> s;
if(k == 0) {
cout << 1 << endl;
continue;
}
s = ' ' + s;
bool flag = true;
for(int i = 1; i <= n / 2; i++) {
if(s[i] != s[n + 1 - i]) {
flag = false;
break;
}
}
cout << (flag ? 1 : 2) << endl;
}
return 0;
}
B.Fortune Telling
题目
给定一个长度为 的数组 和整数 ,判断 和 进行 次如下操作后能否变为 ,第 次操作可以在下面两条中任选一条执行:
- 将当前数字 替换为
- 将当前数字 替换为
保证 和 中一定有一个能用适当操作变为
分析
- 若 为偶数
- 为偶数,无论执行哪种操作 奇偶性都不变
- 为奇数,无论执行哪种操作 都会变为奇数
- 若 为奇数
- 为偶数,无论执行哪种操作 奇偶性都不变
- 为奇数,无论执行哪种操作 都会变为偶数
所以每一种操作对于奇偶性的改变是相同的,那么判断遍历数组执行操作后 奇偶性是否相同即可,若不相同则 无论如何都不能变为 ,那 一定可以
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
while(t--) {
long long n, x, y, a;
cin >> n >> x >> y;
for(int i = 1; i <= n; i++) {
cin >> a;
if(x % 2 && a % 2) {
x++;
} else if(x % 2 == 0 && a % 2) {
x++;
}
}
cout << (x % 2 == y % 2 ? "Alice" : "Bob") << endl;
}
return 0;
}
C.OKEA
题目
给定 构造一个 的矩阵 ,满足:
- 到 的每个整数都出现在矩阵上且仅出现一次
- 对于任意 满足 的算术平均值是整数
分析
可以发现任意一行内的奇偶性是相同的,如果一行内既存在奇数又存在偶数,那么一定存在一个奇偶相邻的情况,它们的算术平均值不是整数
若每行的奇偶性都相同,那么可以构造:
对任意一段 进行求和,可以用等差数列求和公式,可以发现和一定是 的倍数,那么算术平均值也一定是整数。进一步,可以求出通项公式
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
while(t--) {
int n, k;
cin >> n >> k;
if((n % 2 && k == 1) || n % 2 == 0) {
cout << "YES" << endl;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= k; j++)
cout << 2 * ((i - 1) / 2 * k + j) - i % 2 << ' ';
cout << endl;
}
} else {
cout << "NO" << endl;
}
}
return 0;
}
D.Finding Zero
题目
题意较复杂,参考原文 Problem D
分析
考虑一个长度为 的序列 ,不妨设 ,设 ,进行四次询问可得:
易知 是四次询问中结果最大的且 ,序列中的所有数中只有一个 且其他数都大于 ,所以对于任意一个长度为 的序列,询问结果最大的两个数一定不是 ,那么我们每次处理长度为 的序列,排除掉不可能为 的两个不可能为 的选项,再继续加入两个数,以此类推
这样当给定长度 为偶数时,要执行 次询问, 为奇数时最后会剩下一个长度为 的序列,我们把之前已经排除的某个选项再次加入,使序列长度变为 ,要执行 次询问,满足要求
代码
#include<bits/stdc++.h>
using namespace std;
int n;
int del;
int query(int a, int b, int c)
{
cout << "? " << a << ' ' << b << ' ' << c << endl;
int res;
cin >> res;
return res;
}
vector<int> cal(vector<int> v)
{
vector<pair<int, int> > t;
t.push_back({query(v[1], v[2], v[3]), v[0]});
t.push_back({query(v[0], v[2], v[3]), v[1]});
t.push_back({query(v[0], v[1], v[3]), v[2]});
t.push_back({query(v[0], v[1], v[2]), v[3]});
sort(t.begin(), t.end());
del = t.back().second;
return {t[0].second, t[1].second};
}
void solve()
{
cin >> n;
vector<int>v;
for(int i = 1; i <= n; i++) {
v.push_back(i);
if(v.size() == 4)
v = cal(v);
}
if(v.size() == 2) {
cout <<"! "<< v[0] << ' ' << v[1] << endl;
} else {
v.push_back(del);
v = cal(v);
cout<<"! " << v[0] << ' ' << v[1] << endl;
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
while(t--) {
solve();
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】