Accept
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=1e5+50;
int a[maxn];
int vis[maxn];
int main() {
int t;
scanf("%d",&t);
while(t--) {
memset(vis,0,sizeof(vis));
int n,m,k,tot=0,ans=INF;
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int l=1,r=1;r<=n;r++){
if(a[r]>=1&&a[r]<=k) {
if(!vis[a[r]]) ++tot;
vis[a[r]]++;
}
while(vis[a[l]]>1||a[l]>k) {
if(vis[a[l]]>1) vis[a[l]]--,l++;
else l++;
}
if(tot==k) ans=min(ans,r-l+1);
}
if(ans==INF) printf("-1\n");
else printf("%d\n",ans);
}
return 0;
}
/*
6 4 3
1 2 1 2 3 3
*/
Wrong
题意理解有误
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int a[maxn];
int b[maxn],c[maxn];
int main(){
int t;
scanf("%d",&t);
while(t--)
{
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
c[i]=a[i];
}
sort(c,c+n);
int cnt=1;
for(int i=1;i<n;i++)
{
if(c[i]!=c[i-1])
cnt++;
}
//printf("cnt=%d\n",cnt);
if(cnt<k)
{
printf("-1\n");
continue;
}
if(k==1)
{
printf("0\n");
}
int sum=1,p=0,w,le=0; //sum用来计算个数 le是计算的种类
for(int i=0;i<n;i++)
{
if(a[i]!=k)
{
b[p++]=a[i];
w=i;
le++; //计算个数
}
else{
b[p++]=a[i];
w=i;
le++;
break;
}
}
//printf("le=%d p=%d w=%d\n",le,p,w);
sort(b,b+p);//排序用来计算种类个数
for(int i=1;i<p;i++)
{
if(b[i]!=b[i-1])
sum++;
}
//printf("sum1=%d\n",sum);
int lp=le;
if(sum<k)//种类不足 需要再添加花盆
{
int flag=0;
for(int i=p;i<n;i++)//往后移动 依次取花盆
{
w++;
b[i]=a[w];
lp=lp+1;
//printf("lp=%d ",lp);
sort(b,b+lp);
int Q=1;
for(int j=1;j<lp;j++) //计算种类数
{
//printf("b[%d]=%d ",j,b[j]);
if(b[j]!=b[j-1])
Q++;
}
//printf(" Q=%d\n",Q);
if(Q<k)
continue;
else
{
flag=1;
break;
}
}
//printf("lp**=%d\n",lp);
if(flag==1)
printf("%d\n",lp);
else
printf("-1\n");
}
else//种类够了 输出长度 就是花盆个数
{
//printf("le**=%d\n",le);
printf("%d\n",le);
}
}
return 0;
}