清北学堂模拟赛d7t1 消失的数字

Posted zbtrs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了清北学堂模拟赛d7t1 消失的数字相关的知识,希望对你有一定的参考价值。

题目描述

现在,我的手上有 n 个数字,分别是 a1; a2; a3; :::; an
我现在需要删除其中的 k 个数字。当然我不希望随随便便删除,我希望删除 k
个数字之后,剩下的 n - k 个数中有最多的不同的数。
输入格式
第一行两个正整数 n k,含义如题目描述。
接下来一行,有 n 个非负整数,分别是 a1 an
输出格式
一共一行,一个整数 ans,表示删除了 k 个数字后最多的不同的数的个数。
样例输入
4 1
1 3 1 2
样例输出
3
样例解释
如果删去第一个 1:
在[312]中有 3 个不同的数
如果删去 3:
在[112]中有 2 个不同的数
如果删去第二个 1:
在[132]中有 3 个不同的数
如果删去 2:
在[131]中有 1 个不同的数
数据范围
对于 30% 的数据,n 10ai 10
对于 60% 的数据,n 100ai 100
对于 80% 的数据,n 10^5ai 10^5
对于 100% 的数据,n 10^5ai 10^9

分析:一道比较水的贪心题,将每个数字离散化,然后每次将个数最多的数字删到只剩一个,如果剩下的数字都只有一个了,就删掉剩下需要删掉的数字.考场上我用了一个while循环,由于变量没有++,所以死循环了,但样例过了QAQ.其实根本不需要用到循环,直接比较当前重复的数字个数和要删掉的数的个数就ok了。

以后能用for循环就尽量不要用while循环!!

 

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

int n, k, a[100010], cnt, tot = 1;

int main()
{
    scanf("%d%d", &n, &k);
    for (int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    sort(a + 1, a + 1 + n);
    for (int i = 2; i <= n; i++)
        if (a[i] == a[i - 1])
            cnt++;
        else
            tot++;
    if (cnt >= k)
        printf("%d\n", tot);
    else
        printf("%d\n", k - cnt);

    return 0;
}

 

以上是关于清北学堂模拟赛d7t1 消失的数字的主要内容,如果未能解决你的问题,请参考以下文章

清北学堂模拟赛d2t2 位运算2(bit)

清北学堂模拟赛d1t2 火柴棒 (stick)

清北学堂模拟赛d1t1 位运算1(bit)

清北学堂模拟赛d6t1 角谷猜想

5月3日济南清北学堂随堂测试题目

清北学堂模拟赛d7t5 做实验