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;
    }
  • 相关阅读:
    021.day21 反射 Class类 反射常用操作
    020.day20 线程概述 多线程优缺点 线程的创建 线程常用方法 生命周期 多线程同步
    019.day19 缓冲流 对象流 标准输入输出流
    018.day18 map集合如何实现排序 File类 IO流 字节流 字符流 编码
    017.day17 Map接口 克隆 treeSet集合排重缺陷
    016.day16 HashSet TreeSet 比较器Comparable Comparator
    015.day15
    014.day14
    013.day13
    线程
  • 原文地址:https://www.cnblogs.com/zbtrs/p/7638218.html
Copyright © 2011-2022 走看看