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

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

贪心思想:

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

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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值