3377: [Usaco2004 Open]The Cow Lineup 奶牛序列
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 49 Solved: 37
[ Submit][ Status][ Discuss]
Description
约翰的N(1≤N≤100000)只奶牛站成了一列.每只奶牛都写有一个号牌,表示她的品种,号牌上的号码在1…K(1≤K≤10000)范围内.比如有这样一个队列
1,5,3,2,5,3,4,4,2,5,1,2,3
根据约翰敏锐的数学神经,他发现一些子序列在这个队列里出现,比如3,4,1,3,而另一些没有.子序列的各项之间穿插有其他数,也可认为这个子序列存在, 现在,他想找出一个最短的子序列(由1..K组成),使之不在奶牛序列里出现.达个子序列的长度是多少呢?
Input
第1行输入两个整数N和K,接下来N行输入奶牛序列.
Output
最短的不出现子序列.
Sample Input
14 5
1 5 3 2 5 1 3 4 4 2 5 1 2 3
1 5 3 2 5 1 3 4 4 2 5 1 2 3
Sample Output
3
水题。。就是过的人比较少
如果能把n个数分成最多p个区间,满足每个区间所有数字都出现过,那么答案就是p+1
直接开个标记数字标记,如果标记数组满了就清空,答案+1
因为每个位置上的数字最多被添加删除各1次,所以复杂度O(n)
#include<stdio.h>
int a[100005], flag[10005];
int main(void)
{
int n, k, i, j, sum, ans;
scanf("%d%d", &n, &k);
for(i=1;i<=n;i++)
scanf("%d", &a[i]);
ans = 1, sum = k;
for(i=1;i<=n;i++)
{
if(flag[a[i]]==0)
flag[a[i]] = 1, sum--;
if(sum==0)
{
for(j=1;j<=k;j++)
flag[j] = 0;
sum = k;
ans++;
}
}
printf("%d\n", ans);
return 0;
}