POJ-1989(最短非子序列)

/*==========================================================*\
| 最短非子序列长度
| 题目描述:n个数字串,串中每个元素均是1……k之间的任意常数,
|	求最小的s,使得长度为s的由数字1到k组成的某一个串不能在该主串的子串中找到
|	如:n=14,k=5中,主串为:{1 5 3 2 5 1 3 4 4 2 5 1 2 3}
|	长度为1的5个不同串皆可以在主串中找到
|	长度为2的25个不同串亦可以在主串中找到
|	但长度为3的串中,我们无法在主串中找到串 2,2,4 故该组数据的s=3
| 思路:
|	若长度为t的任意串可以在主串中找到,则t的每一个位置上可以取1……k之间的任意数,
|	我们将主串作如下划分:
|	{A}{B}{C}……{F}[G]
|	在{}内即串A,B,C,D这些串中,保证1……k中的每个数字都出现至少一次
|	假设最多能找到这样的{}的个数为t 则 s=t+1
|	
| 证明:
|	对于任意t串,我们可以在其对应的位置上找到所需要的任意数字
|	而对于长度为t+1的串,必定至少有一个排列串不存在……可用数学归纳法加以证明
\*==========================================================*/
int main()
{
	int a, b;
	while (scanf("%d%d", &a, &b) == 2) {
		int i;
		int x;
		int d[10005] = {0};
		int sum = 0;
		int ans = 1;
		for (i = 0; i < a; ++i) {
			scanf("%d", &x);
			if (d[x] == 0) {
				++sum;
				d[x] = 1;
			}
			if (sum == b) {
				memset(d, 0, sizeof(d));
				sum = 0;
				++ans;
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值