删除
【题目描述】
现在,我的 上有 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 个不同的数
【解题思路】
排序去重什么的,然后判断一下有木有比k大,大概就是这个样子
1 program del; 2 var a:array[0..100000] of longint; 3 i,j,n,k,ans:Longint; 4 procedure sort(l,r: longint); 5 var 6 i,j,x,y: longint; 7 begin 8 i:=l; 9 j:=r; 10 x:=a[(l+r) div 2]; 11 repeat 12 while a[i]<x do 13 inc(i); 14 while x<a[j] do 15 dec(j); 16 if not(i>j) then 17 begin 18 y:=a[i]; 19 a[i]:=a[j]; 20 a[j]:=y; 21 inc(i); 22 j:=j-1; 23 end; 24 until i>j; 25 if l<j then 26 sort(l,j); 27 if i<r then 28 sort(i,r); 29 end; 30 begin 31 assign(input,'del.in'); reset(input); 32 assign(output,'del.ans'); rewrite(output); 33 read(n,k); 34 ans:=n; 35 for i:=1 to n do read(a[i]); 36 sort(1,n); 37 for i:=1 to n do 38 begin 39 if a[i]=a[i-1] then 40 begin 41 if k>0 then dec(k); 42 dec(ans); 43 end; 44 end; 45 writeln(ans-k); 46 close(input); 47 close(output); 48 end.