1. 比赛背景与题目概览
Codeforces Round 1078 (Div. 2)是一场面向中阶选手的编程竞赛,包含6道常规算法题。这类比赛通常考察数据结构应用、数学思维和编码实现能力。作为参赛者,我第一时间完成了所有题目,现在将解题思路和实现细节完整分享。
Div. 2级别的比赛题目难度梯度明显:前两题侧重基础编码能力,中间两题需要算法知识,最后两题则考验综合解题能力。本次比赛题目类型包括:
- 字符串处理
- 贪心算法
- 动态规划
- 图论应用
- 数学推导
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 题目详解与解题思路
2.1 Problem A - 字符串重构
题目要求:给定一个字符串,判断是否能通过重新排列字符,使得任意相邻字符不相同。
解题思路:
- 统计每个字符出现频率
- 检查最高频字符是否超过总长度的一半(向上取整)
- 若超过则无法满足条件,否则可以通过间隔排列实现
关键代码:
cpp复制unordered_map<char, int> freq;
for(char c : s) freq[c]++;
int max_count = 0;
for(auto& p : freq) max_count = max(max_count, p.second);
cout << (max_count > (n+1)/2 ? "NO" : "YES");
注意事项:
- 边界情况处理:空字符串、单字符字符串
- 字符频率统计时注意大小写敏感问题
- 时间复杂度O(n),空间复杂度O(字符集大小)
2.2 Problem B - 数字游戏
题目要求:给定数字n和k,进行k次操作:若n能被10整除则除以10,否则减1。求最终结果。
优化思路:
- 当n末尾有0时,除以10能快速减小数值
- 当n末尾非0时,连续减1直到出现0或操作次数用完
- 实际实现时可批量处理连续的减1操作
实现代码:
cpp复制while(k > 0){
if(n % 10 == 0){
n /= 10;
k--;
}else{
int deduct = min(k, n % 10);
n -= deduct
