Monocolor 的题解
记住只在没有思路时使用题解,不要从它复制粘贴代码。请尊重题目和题解的作者。
在解题之前提交题解的代码会导致封禁。
在解题之前提交题解的代码会导致封禁。
作者:
概述
本题要求将 个球通过单次改色操作变为全部同色,求最少操作次数。核心解法是保留当前出现次数最多的颜色不变,将其他所有球改为该颜色,答案为
减去最大出现次数。
分析
核心观察
若最终所有球颜色相同,则必然至少有一种颜色在最终状态下出现 次。初始时该颜色已经存在一定数量,只需将其他颜色的球改为该颜色即可,操作次数等于非该颜色的球数。要使操作次数最少,应选择初始出现次数最多的颜色作为目标颜色。
思路
统计每种颜色 的初始出现次数
。若选择颜色
作为最终颜色,需要将除它以外的
个球全部改成
,因此操作次数为
。在所有颜色中取最大值
,则最小操作次数为:
由于颜色范围是 到
,只需遍历所有颜色统计即可。
具体示例
样例 :
,颜色序列
3 1 2 1。统计:颜色 出现
次,颜色
出现
次,颜色
出现
次,颜色
出现
次。最大出现次数
,答案
。
样例 :全为
,
,答案
。
样例 :序列
4 2 3 3 4 1 2 7 1,。统计:颜色
出现
次,
出现
次,
出现
次,
出现
次,
出现
次,其余
次。最大
,答案
。
算法步骤
- 读入整数
和长度为
的颜色数组。
- 创建计数数组
cnt,大小为(颜色编号从
到
)。
- 遍历每个颜色
,将
cnt[c-1]增加。
- 找出
cnt中的最大值max_cnt。 - 输出结果
。
复杂度分析
- 时间:
,统计和求最大值均为线性。
- 空间:
,用于计数数组。
实现注意事项
- 颜色编号可能不是连续出现的,但范围不超过
,因此数组大小设为
即可,索引用
。
- 输入规模小(
),无需特殊优化。
- 结果一定非负,因为最大出现次数至少为
(
)。
源代码
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N;
cin >> N;
vector<int> cnt(N, 0);
for (int i = 0; i < N; ++i) {
int c;
cin >> c;
cnt[c - 1]++;
}
int max_cnt = 0;
for (int v : cnt) {
max_cnt = max(max_cnt, v);
}
cout << N - max_cnt << '\n';
return 0;
}
import sys
def solve():
data = sys.stdin.read().strip().split()
if not data:
return
N = int(data[0])
C = list(map(int, data[1:1+N]))
cnt = [0] * N
for c in C:
cnt[c - 1] += 1
max_cnt = max(cnt)
print(N - max_cnt)
if __name__ == "__main__":
solve()
评论