您的位置:首页 > 其它

POJ-3320 Jessica's Reading Problem(尺取法)

2016-01-02 17:01 323 查看
题意:给你n个数字。数字可能有重复,求连续的能包含所有不重复的数的最短长度。

思路:尺取法的思路很好想到。。。具体做法是先求出不同数的数量k。然后开始增长,当刚好等于这个数量k后。再减,直到等于k-1。然后再加。。直到结束。

自己碰到的问题。求数量用set可以。然后“当刚好等于这个数量k后。再减,直到等于k-1”这里我卡主。因为set不去重。所以直接earse不可取。queue的话无法保证不重复的数量的求法。map也不知道怎么做。看了题解豁然开朗。。。。

map<int,int>存的是当前的数出现的次数。。。。。

const int maxn=1001000;

int a[maxn];

int main()
{
int p;
scanf("%d",&p);
set<int> s;
for(int i=1;i<=p;i++)
{
scanf("%d",&a[i]);
s.insert(a[i]);
}
int num_s=s.size();
map<int,int> Count;
Count.clear();
int res=p+1;
int f=1,e=1,len=0;
for(;;)
{
while(e<=p&&len<num_s)
{
if(Count[a[e++]]++==0) len++;
}
if(len<num_s) break;
res=min(res,e-f);
if(--Count[a[f++]]==0) len--;
}
printf("%d\n",res);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: