Codeforces Round 855 (Div. 3) A — D

Codeforces Round 855 (Div. 3)

A. Is It a Cat?
题目大意

有一个字符串,在不区分大小写和重复字母的情况下判断是否满足meow。

题目分析

此题可以通过标记的方法来判断,也可以通过C++函数快速解决问题

  • tolower函数:可以将大写字母变为小写字母
  • unique函数:可以去掉重复字母,返回值为去重后最后一个字母的地址,但是不会改变字符串长度
  • erase函数:可以清楚对应区间内的字符
code
#include<bits/stdc++.h>

using namespace std;

int n, m, k, t;

void solve()
{
    string s;
    cin >> n >> s;

    for(int i = 0; i < n; i ++) s[i] = tolower(s[i]);
    s.erase(unique(s.begin(), s.end()), s.end()) ;
    //cout << s << "--\n";

    if(s == "meow") puts("YES");
    else puts("NO");
}

int main()
{
    cin >> t;
    while(t --) solve();
    return 0;
}
B. Count the Number of Pairs
题目大意

有一个由大小写字母组成的字符串,每一次操作可以将一个字母的大小写改变,问在操作次数不大于k次得情况下,大小写字母相皮匹配的最大对数是多少。

题目分析

可以先统计不同字符各出现了几次,然后再遍历每一对字母。假如有两个A和4个a,那么组成两对以后还剩下两个A,将其中一个改成小写即可增加一对。

code
#include<bits/stdc++.h>

using namespace std;

int n, m, k, t;

void solve()
{
    map<char, int>q;
    string s;

    cin >> n >> k >> s;
    for(int i = 0; i < s.size(); i ++) q[s[i]] ++;

    int ans = 0;
    for(int i = 0; i < 26; i ++)
    {
        int r1 = q['a' + i], r2 = q['A' + i];
        ans += min(r1, r2);

        if(k)
        {
            int tem = max(r1, r2) - min(r1, r2);
            tem /= 2;
            if(tem <= k) ans += tem, k -= tem;
            else ans += k, k = 0;
        }
     }

     cout << ans << "\n";
}

int main()
{
    cin >> t;
    while(t --) solve();
    return 0;
}
C. Powering the Hero
题目大意

一副牌有n张,每一张牌的特点是它的力量。有两种类型的卡片:一张英雄牌0;奖励卡,正整数。你可以对牌组做以下操作:从牌堆顶端取一张牌;如果这张卡是奖励卡,你可以把它放在你的奖励卡组顶部或丢弃;如果这张牌是英雄牌,那么你的奖励牌组中最上面那张牌的能量会被加到他的能量中(如果它不是空的),之后英雄会被加到你的军队中,使用的奖励会被丢弃。你的任务是使用这些行动聚集一支军队与最大可能的总力量。

题目分析

可以使用优先队列解决问题,将数字不断加入到队列,遇到零的时候就将队首的数值累加,并弹出队首。

code
#include<bits/stdc++.h>
#define int long long

using namespace std;

int n, m, k, t;

void solve()
{
    priority_queue<int>q;
    cin >> n;

    int ans = 0;
    while(n --)
    {
        int u; cin >> u;
        if(u) q.push(u);
        else if(!q.empty())
        {
            ans += q.top();
            q.pop();
        }
    }

    cout << ans << "\n";
}

signed main()
{
    cin >> t;
    while(t --) solve();
    return 0;
}
D. Remove Two Letters
题目大意

有一个小写字母组成的字符串。从字符串s中删除两个连续字符,在这样的操作之后可以获得多少不同的字符串。

题目分析

我们可以遍历删除每两个相邻字符,若相邻两次操作去掉的字母是一样的则对答案没有贡献。所以只要判断相邻两次操作去点的字符是否一样即可。

不要忘记加上1,因为每次比较都是以前一个为基准的,所以要把第一个算上。

code
#include<bits/stdc++.h>

using namespace std;

int n, m, k, t;

void solve()
{
    string s;
    cin >> n >> s;

    int ans = 0;
    for(int i = 1; i < n - 1; i ++)
        if(s[i - 1] != s[i + 1]) ans ++;

    cout << ans + 1 << "\n";
}

int main()
{
    cin >> t;
    while(t --) solve();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Codeforces Round 894 (Div. 3) 是一个Codeforces举办的比赛,是第894轮的Div. 3级别比赛。它包含了一系列题目,其中包括题目E. Kolya and Movie Theatre。 根据题目描述,E. Kolya and Movie Theatre问题要求我们给定两个字符串,通过三种操作来让字符串a等于字符串b。这三种操作分别为:交换a中相同位置的字符、交换a中对称位置的字符、交换b中对称位置的字符。我们需要先进行一次预处理,替换a中的字符,然后进行上述三种操作,最终得到a等于b的结果。我们需要计算预处理操作的次数。 根据引用的讨论,当且仅当b[i]==b[n-i-1]时,如果a[i]!=a[n-i-1],需要进行一次操作;否则不需要操作。所以我们可以遍历字符串b的前半部分,判断对应位置的字符是否与后半部分对称,并统计需要进行操作的次数。 以上就是Codeforces Round 894 (Div. 3)的简要说明和题目E. Kolya and Movie Theatre的要求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Codeforces Round #498 (Div. 3) (A+B+C+D+E+F)](https://blog.csdn.net/qq_46030630/article/details/108804114)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Codeforces Round 894 (Div. 3)A~E题解](https://blog.csdn.net/gyeolhada/article/details/132491891)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值