Codeforces Round 968 (Div. 2) ABC题详细题解(C++,Python)

前言:

        本文为Codeforces Round 968 (Div. 2)的ABC详细题解,包含C++,Python语言描述,觉得有帮助或者写的不错可以点个赞 

        感觉D题说的好抽象,看不懂,之后实力够了更新

目录

题A:

题目大意和解题思路:

代码实现(C++):

代码实现(Python):

题B:

题目大意和解题思路:

代码实现(C++):

代码实现(Python):

题C:

题目大意和解题思路:

代码实现(C++):

代码实现(Python):


题A:

Problem - A - Codeforces

题目大意和解题思路:

题目意思就是说,现在一个字符串,满足下面条件,就是好字符串

  1. k ≥ 2。
  2. s = t1 + t2 + ... + tk,其中 + 表示连接操作。例如,abc = a + bc。
  3. 对于所有的 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变成 max(a_i, a_(i + 1)),然后移除a_(i + 1)

B选择数组中一个数字,然后把这个数字a_i变成 min(a_i, a_(i + 1)),然后移除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,并且满足以下两个条件:

  1. sk ≠ sk+1
  2. 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)

  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,根据提供的引用内容,我无法理解你具体想要问什么问。请提供更清晰明确的问,我将竭诚为你解答。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Codeforces Round 860 (Div. 2)题解](https://blog.csdn.net/qq_60653991/article/details/129802687)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【CodeforcesCodeforces Round 865 (Div. 2) (补赛)](https://blog.csdn.net/t_mod/article/details/130104033)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Codeforces Round 872 (Div. 2)(前三道](https://blog.csdn.net/qq_68286180/article/details/130570952)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值