[题解]CF1800B Count the Number of Pairs

题意

给定一个字符串 S,你可以进行 k 次操作,每次操作你可以选定一个 i,并将 Si 的大小写转换。

求:操作后,最多有几组配对的字符。(配对的定义是:对于一个字符,如果有大写,有小写被称之为一组。例如:Aa 为一组。)

思路

你在读入的时候,你预处理一个数组 visc,0/1 表示,c 这个字符的大写/小写出现的次数。

然后,你就暴力判断 |vissi,0vissi,1| 是否大于 1,如果大于 1 才有变换的意义;否则直接将答案加上它。

对于每一次变换,你判断一下 |vissi,0vissi,1|2 和当前 k 的关系,然后加答案即可。

Code

#include <bits/stdc++.h>  
#define re register  
  
using namespace std;  
  
const int N = 27;  
int T,n,k,ans;  
int vis[N][2];  
string s;  
  
inline int get(char c){  
    if (c >= 'A' && c <= 'Z') return c - 'A' + 1;  
    return c - 'a' + 1;  
}  
  
int main(){  
    ios::sync_with_stdio(0);  
    cin.tie(0);  
    cout.tie(0);  
    cin >> T;  
    while (T--){  
        memset(vis,0,sizeof(vis));  
        cin >> n >> k >> s;  
        ans = 0;  
        s = ' ' + s;  
        for (re int i = 1;i <= n;i++){  
            if (s[i] >= 'A' && s[i] <= 'Z') vis[get(s[i])][0]++;//统计   
            else vis[get(s[i])][1]++;  
        }  
        for (re int i = 1;i <= 26;i++){  
            int t = abs(vis[i][0] - vis[i][1]);  
            if (t <= 1) ans += min(vis[i][0],vis[i][1]);//判断是否要进行变换   
            else{  
                int cnt = t >> 1;  
                if (cnt <= k){//如果要变换的次数小于等于 k 就可以全部变换   
                    ans += min(vis[i][0],vis[i][1]) + cnt;  
                    k -= cnt;  
                }  
                else{//否则,只能变换 k 次   
                    ans += min(vis[i][0],vis[i][1]) + k;  
                    k = 0;  
                }  
            }  
        }  
        printf("%d\n",ans);  
    }  
    return 0;  
}  

作者:WaterSun

出处:https://www.cnblogs.com/WaterSun/p/18266709

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   WBIKPS  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示