Codeforces Global Round 20 [B~D]
链接:contest link
B.I love AAAB
题目
如果一个字符串长度大于等于 且最后一个字符为 B
,其他字符都为 A
,那么称这个字符串是 好 的
给定一个初始为空串的字符串 ,可以执行任意次以下操作:
- 在 的任意位置插入一个好的字符串
给定一个字符串 ,判断能否通过操作使 变为
分析
容易发现好串的 A
个数大于等于 B
的个数,所以如果 可以由好串组成,对于它的任意子串 满足 A
个数大于等于 B
的个数,且 的最后一个字符一定为 B
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
while(t--) {
string s;
int cnt = 0;
cin >> s;
bool fnd = false;
for(int i = 0; i < (int)s.size(); i++) {
if(s[i] == 'A')
cnt++;
else
cnt--;
if(cnt < 0) {
cout << "NO" << endl;
fnd = true;
break;
}
}
if(!fnd)
cout << (s[s.size() - 1] == 'B' ? "YES" : "NO") << endl;
}
return 0;
}
C.Unequal Array
题目
给定一个长度为 的数组 ,一个数组的 equality 定义为满足 的 的个数,可以执行如下操作:
- 选定两个整数 使
求使 的 equality 小于等于 的最小操作数
分析
设 是满足 的最小的 , 是最大的 ,可以发现如果 那么 的 equality 大于等于 ,在执行操作 后 equality 变为 ,所以最小操作数为 。如果 ,那么最小操作数为
代码
#include<bits/stdc++.h>
using namespace std;
int a[200000 + 5];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
while(t--) {
int n, st = -1, en = -1;
cin >> n;
for(int i = 1; i <= n; i++)
cin >> a[i];
for(int i = 2; i <= n; i++) {
if(a[i] == a[i - 1]) {
st = i;
break;
}
}
for(int i = n; i >= 2; i--) {
if(a[i] == a[i - 1]) {
en = i - 1;
break;
}
}
if(st == -1 || en < st)
cout << 0 << endl;
else
cout << (en - st == 0 ? 1 : en - st) << endl;
}
return 0;
}
D.Cyclic Rotation
题目
给定一个长度为 的数组 ,如果 ,可以执行操作
给定另一个数组 ,判断 能否经过多次操作变成
分析
考虑反向操作,即对于 中相邻的两个元素 我们可以把 放到 前的任意位置
用双指针,若现在有 要使 变为
若 那么
否则我们希望移动 中的一个,如果两者都无法移动,则无法匹配输出 NO
用一个 map<int, int> cnt
来记录匹配不成功的 ,如果 那么可以消去一个 ,如果不可以,那么把 加入 cnt
,记为匹配不成功,等待后面的 消去
代码
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 200000 + 5;
int a[MAX_N], b[MAX_N];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
while(t--) {
int n;
cin >> n;
for(int i = 1; i <= n; i++)
cin >> a[i];
for(int i = 1; i <= n; i++)
cin >> b[i];
map<int, int> cnt;
int l = 1, r = 1;
bool flag = true;
while(r <= n) {
if(l <= n && a[l] == b[r]) {
l++;
r++;
} else {
if(cnt[b[r]] && b[r] == b[r - 1]) {
cnt[b[r]]--;
r++;
} else if(l <= n) {
cnt[a[l]]++;
l++;
} else {
flag = false;
break;
}
}
}
cout << (flag ? "YES" : "NO") << endl;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】