• 清北学堂模拟赛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
    ", tot);
        else
            printf("%d
    ", k - cnt);
    
        return 0;
    }
  • 相关阅读:
    MySQL表行数查询最佳实践
    mysqldump备份表中有大字段失败的排错过程
    μC/OSⅡ在C8051F060上的移植及其应用
    OSSchedLock()函数透析
    32位与64位区别
    【Cesium】Animation显示系统时间
    【Cesium】根据经纬度计算距离
    【Cesium】 鼠标拾取椭球、地形、模型坐标点(经度+纬度+高程)
    【Python学习】Selenium模拟浏览器抓取数据
    【Cesium】polygon中的height和extrudedHeight的区别
  • 原文地址:https://www.cnblogs.com/zbtrs/p/7638218.html
Copyright © 2020-2023  润新知