1. 程式人生 > >清北學堂模擬賽d7t1 消失的數字

清北學堂模擬賽d7t1 消失的數字

code color return 正整數 一行 一道 我希望 else 死循環

題目描述

現在,我的手上有 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 消失的數字