清北学堂模拟赛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;
}

 

posted @ 2017-10-08 19:10  zbtrs  阅读(311)  评论(0编辑  收藏  举报