设初始大写数量为 U,小写数量为 L=n−U。
优先把小写翻成大写:若 k≤L,直接能得到 U+k。
若 k>L,先把全部小写翻为大写得到 n,剩余步数 r=k−L:
综上公式:

时间复杂度:O(n);空间复杂度:O(1)。
#include <bits/stdc++.h>
using namespace std;
int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	long long n, k;
	if (!(cin >> n >> k)) return 0;
	string s;
	cin >> s;
	long long U = 0; // 初始大写字母数量
	for (char c : s) {
		if ('A' <= c && c <= 'Z') ++U;
	}
	long long L = n - U; // 初始小写字母数量
	long long ans = 0;
	if (k <= L) {
		// 直接把 k 个小写翻成大写
		ans = U + k;
	} else {
		// 全部小写翻成大写后,剩余步数只影响奇偶
		long long r = k - L;
		if (r % 2 == 0) ans = n;
		else ans = n - 1;
	}
	cout << ans << "\n";
	return 0;
}
import sys
def main():
	data = sys.stdin.read().strip().split()
	if len(data) < 3:
		return
	n = int(data[0])
	k = int(data[1])
	s = data[2]
	U = sum(1 for c in s if 'A' <= c <= 'Z')  # 初始大写数量
	L = n - U  # 初始小写数量
	if k <= L:
		ans = U + k  # 直接翻 k 个小写
	else:
		r = k - L  # 剩余步数
		ans = n if r % 2 == 0 else n - 1  # 看奇偶决定是否损失 1
	print(ans)
if __name__ == "__main__":
	return_code = main()
import java.io.*;
import java.util.*;
public class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		long n = Long.parseLong(st.nextToken());
		long k = Long.parseLong(st.nextToken());
		String s = br.readLine();
		long U = 0; // 初始大写数量
		for (int i = 0; i < s.length(); i++) {
			char c = s.charAt(i);
			if (c >= 'A' && c <= 'Z') U++;
		}
		long L = n - U; // 初始小写数量
		long ans;
		if (k <= L) {
			// 直接把 k 个小写翻成大写
			ans = U + k;
		} else {
			// 用掉所有小翻成大写,剩余步数只影响奇偶
			long r = k - L;
			ans = (r % 2 == 0) ? n : (n - 1);
		}
		System.out.println(ans);
	}
}
        小红拿到了一个仅由大小写字母构成的长度为 n 的字符串,她每次操作可以将一个字符在大小写之间切换(例如将 ′a’ 变为 ′A′ ,或将 ′Y′ 变为 ′y′ )。
她希望经过恰好 k 次操作后,大写字母的数量尽可能多,请输出最终字符串中大写字母的数量。
在一行上输入两个整数 n 和 k(1≤n≤105,1≤k≤109) 。
在一行上输入一个长度为 n ,由大小写字母构成的字符串 s 。
在一行上输出一个整数,表示经过恰好 k 次操作后,最终字符串中大写字母的数量。
输入
1 3
A
输出
0