开始的时候没有想出算法,上网查题解,居然有人说这题是动态规划……无奈。偶然间看到了上海交大马融牛的解题表格:只有一句话,从前向后扫描。才知道这道题用到的只不过是一个贪心思想。
贪心思想:
把序列划分成尽量多的连续子序列,使得每一个连续子序列都满足如下条件:
1..k每个数字都在这个子序列中出现过一次,并且至少有一个数字只出现过一次。
这样的子序列的个数+1就是答案
贪心思想证明:
要让长度为j的序列全部出现,必须满足第一个数字可以取1..k任意一个,第二个数字可以取1..k任意一个……以此类推
当已经划分成j个子序列并无法向后划分的时候,说明第j+1个数是不能在1..k的范围内自由选择的。所以,最短不出现子序列的长度是k+1.
证毕。
CODE
Program POJ1989;//By_Poetshy
Const
maxn=100000;
Var
a :Array[1..maxn]of Longint;
v :Array[1..maxn]of Boolean;
i,n,k,j :Longint;
ans :Longint;
BEGIN
readln(n,k);
for i:=1 to n do readln(a[i]);
j:=0;
fillchar(v,sizeof(v),0);
for i:=1 to n do
begin
if not v[a[i]] then
begin
v[a[i]]:=true;
inc(j);
end;
if j=k then
begin
fillchar(v,sizeof(v),0);
j:=0;inc(ans);
end;
end;
writeln(ans+1);
END.