前言:
本文为Codeforces Round 968 (Div. 2)的ABC详细题解,包含C++,Python语言描述,觉得有帮助或者写的不错可以点个赞
感觉D题说的好抽象,看不懂,之后实力够了更新
目录
题A:
题目大意和解题思路:
代码实现(C++):
代码实现(Python):
题B:
题目大意和解题思路:
代码实现(C++):
代码实现(Python):
题C:
题目大意和解题思路:
代码实现(C++):
代码实现(Python):
题A:
Problem - A - Codeforces
题目大意和解题思路:
题目意思就是说,现在一个字符串,满足下面条件,就是好字符串
- k ≥ 2。
- s = t1 + t2 + ... + tk,其中 + 表示连接操作。例如,abc = a + bc。
- 对于所有的 1 ≤ i < j ≤ k,ti 的第一个字符不等于 tj 的最后一个字符
然后让你确定一个字符串是否是好字符串
脑经急转弯吧, (我感觉弱智题,容易想歪,不敢提交)
题目意思就是说,把一个字符串分成至少两份,然后分成的每一份的第一个字符串,不能等于下一份的最后一个字符串
那我直接从下标0 到 1的位置开始分就i可以了,分成两个,然后题目就变成了,第一个不等于最后一个就是好字符串...
代码实现(C++):
int main() {
std::ios::sync_with_stdio(0);
std::cin.tie(0);
int tt;
std::cin >> tt;
while (tt--) {
int n;
std::cin >> n;
std::string s;
std::cin >> s;
if (s[0] != s[n - 1]) {
std::cout << "YES" << "\n";
} else {
std::cout << "NO" << "\n";
}
}
}
代码实现(Python):
def main():
tt = int(input())
res = []
for _ in range(tt):
n = int(input())
s = input()
if s[0] != s[n - 1]:
res.append("YES")
else:
res.append("NO")
for r in res:
print(r)
题B:
Problem - B - Codeforces
题目大意和解题思路:
两个人A,B进行游戏,给一个数组吧,然后:
A选择数组中一个数字,然后把这个数字变成 ,然后移除a_(i + 1)
B选择数组中一个数字,然后把这个数字变成 ,然后移除a_(i + 1)
当数组中就剩下一个元素的时候停止
A想让数组元素剩下元素尽可能大,B想让数组剩下元素尽可能小
假设他们都是最优的策略,然后让你求最后的一个数字是什么
我觉得这个题目还是有点意思的,题目意思翻译一下就是:
A选择两个相邻的数字然后移除其中的最小值,B就是移除最大值
然后都使用最优策略
最优策略是什么呢?贪心,想让元素尽可能大,那就每次移除最小的元素,反之就是每次移除最大的元素。
那么排序数组
那么移除一个最大,移除一个最小,剩下的最后一个肯定就是数组中间的那个
代码实现(C++):
int main() {
std::ios::sync_with_stdio(0);
std::cin.tie(0);
int tt;
std::cin >> tt;
while (tt--) {
int n;
std::cin >> n;
std::vector<int> A(n);
for (int i = 0; i < n; i++) {
std::cin >> A[i];
}
std::sort(A.begin(), A.end());
std::cout << A[n / 2] << "\n";
}
}
代码实现(Python):
def main():
tt = int(input())
res = []
for _ in range(tt):
n = int(input())
A = list(map(int, input().split()))
A.sort()
res.append(A[n // 2])
for r in res:
print(r)
题C:
Problem - C - Codeforces
题目大意和解题思路:
Turtle 认为一对整数 (i, j) (1 ≤ i < j ≤ n) 是一个(pleasant pair)存在一个整数 k 满足 i ≤ k < j,并且满足以下两个条件:
- sk ≠ sk+1
- sk ≠ si 或 sk+1 ≠ sj
此外,Turtle 认为一对整数 (i, j) (1 ≤ i < j ≤ n) 是一个好的对(good pair)当且仅当 si = sj 或者 (i, j) 是一个(pleasant pair)
然后给你一个字符串,变换这个字符串,让好的对数量最大化
题目意思说的好奇怪,只要在[i, j)这个区间内有一对相邻且不相等的数字,然后这对数字的前一个不等于si,后一个不等于sj即可,或者si == sj
我的思路比较猜测,但确实可以ac, 尽可能的使得相邻的字符串不相等就行了,这样每一个长度大于三的区间都可以满足
注意:在 Python 中,字符串是不可变的,每次进行字符串拼接操作时,都会创建一个新的字符串对象,这会导致较高的内存和时间开销,所以放在列表里面再用join
代码实现(C++):
int main() {
std::ios::sync_with_stdio(0);
std::cin.tie(0);
int tt;
std::cin >> tt;
while (tt--) {
int n;
std::cin >> n;
std::string s;
std::cin >> s;
std::vector<int> cnt(26, 0);
for (auto& c : s) {
cnt[c - 'a']++;
}
std::string res = "";
int cur = 0;
while (n) {
if(cnt[cur] != 0) {
cnt[cur]--;
res += char(cur + 'a');
n--;
}
cur = (cur + 1) % 26;
}
std::cout << res << "\n";
}
}
代码实现(Python):
def main():
tt = int(input())
res = []
for _ in range(tt):
n = int(input())
s = input()
cnt = [0] * 26
for c in s:
cnt[ord(c) - ord('a')] += 1
out = []
cur = 0
while n > 0:
if cnt[cur] > 0:
cnt[cur] -= 1
n -= 1
out.append(chr(cur + ord('a')))
cur = (cur + 1) % 26
res.append(''.join(out[:]))
for r in res:
print(r)