您的位置:首页 > 其它

POJ1989 The Cow Lineup——贪心+扫描技巧

2011-08-31 15:13 274 查看
开始的时候没有想出算法,上网查题解,居然有人说这题是动态规划……无奈。偶然间看到了上海交大马融牛的解题表格:只有一句话,从前向后扫描。才知道这道题用到的只不过是一个贪心思想。

贪心思想:

把序列划分成尽量多的连续子序列,使得每一个连续子序列都满足如下条件:

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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: