众数 I - 详解及代码实现

题目背景

pigstd 是一个可爱的男孩子。他在 NOI2022 中的众数一题定义了 "10^6" 个 std::deque 并没有 MLE。

题目描述

给定一个长度为 "n" 的序列 "a",我们通过以下方式构造序列 "b":

  • 初始时 "b=a"。
  • 依次对 "b" 进行 "k" 次操作,每次操作选择任意一个元素并将其修改为任意整数。

dXqwq 定义一个序列的众数为所有出现次数最大的数。例如 [1,1,4,5,1,4] 的众数为 "1",而 [1,14,5,14,19,19,8,10] 的众数为 "14,19"。

你需要求出有多少整数可能成为 "b" 的众数

输入格式

第一行输入两个整数 "n,k"。

第二行输入 "n" 个整数 "a_i"。

输出格式

输出一个整数,代表可能成为众数的数的数量。

特别地,如果答案为正无穷,输出 pigstd

样例 #1

样例输入 #1

5 0
1 2 3 4 5

样例输出 #1

5

样例 #2

样例输入 #2

5 1
1 2 3 4 5

样例输出 #2

pigstd

样例 #3

样例输入 #3

5 1
1 1 2 2 3

样例输出 #3

3

提示

【样例解释】

对于第一组数据,最终 "1,2,3,4,5" 可能为区间众数。

对于第二组数据,将第一个数换成 "6,7,8,9,"cdots" 后它们均会成为区间众数,因此答案为正无穷。

对于第三组数据,"1,2,3" 可能成为区间众数。

【提示】

开 "10^6" 个 std::deque 在空间限制为 1024MB 时不一定会 MLE。

【数据范围】

本题采用捆绑测试。

  • Subtask 1(20 pts):"n""≤5"。
  • Subtask 2(20 pts):"n""≤10^3"。
  • Subtask 3(20 pts):"k=0"。
  • Subtask 4(20 pts):"k=1"。
  • Subtask 5(20 pts):无特殊限制。

对于 "100%" 的数据,"1""≤n""≤10^6","0""≤k""≤n ","1""≤a_i""≤n"。 用C++做出这道题,不要用unordered_map和auto(附代码)内容:### 代码

#include <iostream>
#include <vector>
#include <algorithm>
#include <map>

using namespace std;

int main()
{
    int n, k;
    cin >> n >> k;

    vector<int> a(n);
    map<int, int> count;

    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
        count[a[i]]++;
    }

    int maxCount = 0;
    for (auto it = count.begin(); it != count.end(); it++)
    {
        maxCount = max(maxCount, it->second);
    }

    int possibleCount = 0;
    for (auto it = count.begin(); it != count.end(); it++)
    {
        if (it->second >= maxCount - k)
        {
            possibleCount++;
        }
    }

    if (possibleCount == n || k >= possibleCount)
    {
        cout << "pigstd" << endl;
    }
    else
    {
        cout << possibleCount << endl;
    }

    return 0;
}

原文地址: https://www.cveoy.top/t/topic/pOhR 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录