/*==========================================================*\
| 最短非子序列长度
| 题目描述: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;
}
POJ-1989(最短非子序列)
最新推荐文章于 2020-12-27 16:43:47 发布