zoukankan      html  css  js  c++  java
  • 清北学堂模拟赛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的性能优化
    MySql的备份还原
    MySql的数据目录
    MySql的事务
    MySql的视图
    算法笔记_006:全源最短路径问题【动态规划法】
    算法笔记_005:堆排序问题【变治法】
    算法笔记_004:8枚硬币问题【减治法】
    算法笔记_003:矩阵相乘问题【分治法】
    使用MongoDB和JSP实现一个简单的购物车系统
  • 原文地址:https://www.cnblogs.com/zbtrs/p/7638218.html
Copyright © 2011-2022 走看看