T1 删除
题目
【题目描述】
现在,我的手上有 n 个数字,分别是 a1,a2,a3,...,an。 我现在需要删除其中的 k 个数字。当然我不希望随随便便删除,我希望删除 k 数字之后,剩下的 n−k 个数中有最多的不同的数。
【输入格式】
第一行两个正整数 n 和 k,含义如题目描述。 接下来一行,有 n 个非负整数,分别是 a1 到 an。
【输出格式】
一共一行,一个整数ans,表示删除了 k 个数字后最多的不同的数的个数。
【输入样例】
41
1312
【输出样例】
3
【数据规模】
对于 30% 的数据,n≤10,ai ≤10。
对于 60% 的数据,n≤100,ai ≤100。
对于 80% 的数据,n≤10^5,ai ≤10^5。
对于 100% 的数据,n≤10^5,ai ≤10^9。
解析
先排序,后去重,
然后,然后就没有然后了。
Code
#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int MAXN = 100005; int n, m, k, i, j, a[MAXN]; inline int get() { char c; while (((c = getchar()) < 48 || c > 57) && c != '-'); if (c == '-') { int res = 0; while ((c = getchar()) >= 48 && c <= 57) res = res * 10 + c - '0'; return -res; } else{ int res = c - '0'; while ((c = getchar()) >= 48 && c <= 57) res = res * 10 + c - '0'; return res; } } int main() { //freopen("del.in", "r", stdin); //freopen("del.out", "w", stdout); cin >> n >> k; for(i = 1; i <= n; i ++) a[i] = get(); sort(a + 1, a + 1 + n); m = unique(a + 1, a + 1 + n) - 1 - a; k -= (n - m); if (k <= 0) cout << m; else cout << m - k; //fclose(stdin); //fclose(stdout); }