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
贪心思想:
把序列划分成尽量多的连续子序列,使得每一个连续子序列都满足如下条件:
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.
相关文章推荐
- POJ1989 The Cow Lineup 额,贪心??
- poj 1989 The Cow Lineup 最短非子序列问题
- poj 1989 The Cow Lineup
- POJ 1989 The Cow Lineup【最短非子序列】
- poj 1989 The Cow Lineup 数组
- POJ 1989 The Cow Lineup [dp]
- poj-1989 The Cow Lineup
- H-The Cow Lineup(POJ 1989)
- poj-1989 The Cow Lineup
- poj 1989 The Cow Lineup
- POJ 1989 The Cow Lineup 笔记
- [USACO2004][poj1989]The Cow Lineup(乱搞)
- POJ 1989 The Cow Lineup
- poj 3267 The Cow Lexicon 动态规划
- POJ 3180 The Cow Prom(SCC)
- (贪心5.1.2)POJ 2287 Tian Ji -- The Horse Racing
- poj 3262 Protecting the Flowers(贪心)
- <poj - 2139> Six Degrees of Cowvin Bacon 最短路径问题 the cow have been making movies
- poj 3267 The Cow Lexicon DP 动态规划
- poj3262 Protecting the Flowers(贪心)