清北學堂模擬賽d7t1 消失的數字
阿新 • • 發佈:2017-10-08
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:
在[3,1,2]中有 3 個不同的數
如果刪去 3:
在[1,1,2]中有 2 個不同的數
如果刪去第二個 1:
在[1,3,2]中有 3 個不同的數
如果刪去 2:
在[1,3,1]中有 1 個不同的數
數據範圍
對於 30% 的數據,n ≤ 10,ai ≤ 10。
對於 60% 的數據,n ≤ 100,ai ≤ 100。
對於 80% 的數據,n ≤ 10^5,ai ≤ 10^5。
對於 100% 的數據,n ≤ 10^5,ai ≤ 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 消失的數字