上海计算机学会2020年10月月赛C++丙组T5小球的颜色

小球的颜色

内存限制: 256 Mb时间限制: 1000 ms

题目描述

给定 n 个数字 a1​,a2​,…,an​。我们需要更改一些数字,使得最后数字种类不超过 k 种,请问最少需要更改多少数字。

输入格式
  • 第一行:两个整数 n 与 k;
  • 第二行:n 个整数 a1​,a2​,…,an​。
输出格式
  • 单个整数,表示答案。
数据范围
  • 对于 30% 的数据,1≤n≤100;
  • 对于 40% 的数据,1≤n≤1000;
  • 对于 100% 的数据,1≤k≤n≤2×10^5。
  • 1≤ai≤n
样例数据

输入:
5 2
1 1 2 2 5
输出:
1
说明:
将颜色为5的小球改成2即可
输入:
10 3
5 1 3 2 4 1 1 2 3 4
输出:

解析:贪心策略,保留 数量最多的k种小球,需要先用同排序统计每种小球的数量,然后按从大到小排序,总数n去掉前k个最大数即可,详见代码:

#include
using namespace std;
int n, k, a;
int t[200005];//t[i]表示数字i有几个
int main() {
    cin >> n >> k;
    for(int i = 1; i <= n; i++) {
        cin >> a;
        t[a]++;//统计数字a有几个
    }
    //从大到小排序
    sort(t + 1, t + 1 + n, greater());
    for(int i = 1; i <= k; i++) {//去掉前k个最大数
        n -= t[i];
    }
    cout << n;
    return 0;
}

你可能感兴趣的:(上海计算机学会月赛丙组,c++,算法,开发语言)