Educational Codeforces Round 6 620C Pearls in a Row

题意:从一大长串中截取子串,要求每一个子串中必须要有两个相同的数字,当存在子串的时候输出最多可以存在几个子串(贪心算法),并且输出子串的首尾端点,不存在这种子串的时候就输出-1.


解题策略:贪心算法+STL,每当有两个相同数字出现时则将这一部分变为一个子串,可以获得最大数量。


本人采用了数组的方式来记录下子串的首尾端点,不过要注意开足够大的数组,第一次数组没开够结果runtime error/(ㄒoㄒ)/~~

#include <iostream>
#include <set>
#include <cstdlib>
#include <cstring>
#include <cstdio>
using namespace std;
int a[200000][2];
int main()
{
    set<int> s;
    int n,num,ans,i;
    while(cin>>n)
    {
        s.clear();
        ans = 0;
        memset(a,0,sizeof(a));
        a[0][0] = 1;
        for(i=1;i<=n;i++)
        {
           cin >> num;
           if (s.count(num))
           {

               a[ans++][1] = i;
               a[ans][0] = i+1;
               s.clear();
           }
           else
                s.insert(num);
        }
        if(a[ans-1][1]<n)
           a[ans-1][1] = n;
        if(ans)
        {
            printf("%d\n",ans);
            for(i=0;i<ans;i++)
            {
                printf("%d %d\n",a[i][0],a[i][1]);
            }
        }
        else
            printf("-1\n");
    }
    return 0;
}


你可能感兴趣的:(ACM,STL,codeforces)