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;
}

猜你喜欢

转载自blog.csdn.net/m0_60610120/article/details/129331105
今日推荐