标签:input NPU algo algorithm for data font mes ret
约翰的 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行输入两个整数 N 和K ,接下来 N 行输入奶牛序列.
输出一行,最短的不出现子序列的长度。
14 5 1 5 3 2 5 1 3 4 4 2 5 1 2 3
3
样例解释:
所有长度为1和2的可能的子序列都出现了,但长度为3的子序列"2,2,4"却没有出现。
考虑将奶牛分组。
将1...k中的每个数字都出现的连续一段分成一组。
例如,样例分成[1,5,3,2,5,1,3,4],[4,2,5,1,2,3]两组。
容易发现,每一组的最后一个数字一定是在这一组中最后出现且只出现一次。
所以!把每个组的最后一个数字取出来,然后剩下的组不成一组的,必然存在没有出现的数字,将其取出。
所以答案是组数+1。
代码
#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int N=10010; int a[N]; int n,k,x; int ans,tot; int main () { scanf("%d%d",&n,&k); for(int i=1; i<=n; i++) { scanf("%d",&x); if(!a[x]) { a[x]=1; tot++; } if(tot==k) { memset(a,0,sizeof(a)); tot=0; ans++; } } printf("%d\n",ans+1); return 0; }
P5093 [USACO04OPEN]The Cow Lineup 奶牛序列
标签:input NPU algo algorithm for data font mes ret
原文地址:https://www.cnblogs.com/mysh/p/11788138.html