POJ 1989 The Cow Lineup【最短非子序列】
题意: 给出n 个数,每个数的范围在1..k之间,问最短非子序列的长度是多少。
分析:将集合尽可能划分成多个区间,并满足每个区间包含1..k之间所有的数,如果分成了 x 个区间,那么这些区间一定包含了所有长度为 x 的子序列,而没有包含全
部的长度为 x+1 的子序列,因为可以通过在每个区间任取一个数来组成长度为 x 的序列。
#include<stdio.h> #include<string.h> #define clr(x)memset(x,0,sizeof(x)) int v[10005]; int main() { int n,k,p,i,res,num; while(scanf("%d%d",&n,&k)!=EOF) { res=num=0; clr(v); for(i=0;i<n;i++) { scanf("%d",&p); if(!v[p]) { v[p]=1; num++; if(num==k) { res++; clr(v); num=0; } } } printf("%d\n",res+1); } return 0; }