[题解]CF1800B Count the Number of Pairs
题意
给定一个字符串 ,你可以进行 次操作,每次操作你可以选定一个 ,并将 的大小写转换。
求:操作后,最多有几组配对的字符。(配对的定义是:对于一个字符,如果有大写,有小写被称之为一组。例如:A
和 a
为一组。)
思路
你在读入的时候,你预处理一个数组 表示, 这个字符的大写/小写出现的次数。
然后,你就暴力判断 是否大于 ,如果大于 才有变换的意义;否则直接将答案加上它。
对于每一次变换,你判断一下 和当前 的关系,然后加答案即可。
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 国际」许可协议进行许可。
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】