【CF1257C】Dominated Subarray【贪心】

题意:给定一个数组,求最小的字数组使得数组里存在至少一对重复元素

题解:每个点求出他的后继在哪,然后每次贪心就这个点到他的后继为一个子数组,求出最小的就是答案

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#define ll long long
using namespace std;
int T,n,ans;
int a[200001],nxt[200001],hd[200001];
int main()
{
    scanf("%d",&T);
    while(T--)
    {
      for(int i=1;i<=n;i++)hd[i]=nxt[i]=0;
      scanf("%d",&n);
      for(int i=1;i<=n;i++){scanf("%d",&a[i]);nxt[i]=hd[a[i]];hd[a[i]]=i;}
      ans=1e9;
      for(int i=1;i<=n;i++)if(nxt[i])ans=min(ans,i-nxt[i]+1);
      printf(ans==1e9?"-1\n":"%d\n",ans);
    }
    return 0;
}

 

posted @ 2019-11-15 11:09  worcher  阅读(275)  评论(0编辑  收藏  举报