cf 620C Pearls in a Row(贪心)

d.有一串数字,要把这些数字分成若干连续的段,每段必须至少包含2个相同的数字,怎么分才能分的段数最多?

比如 是1 2 1 3 1 2 1

那么 答案是

2
1 3
4 7

即最多分在2段,第一段是1~3,第二段是4~7。

即分成这2段:1 2 1,3 1 2 1

 

s.很不错的一道贪心的题。当时没怎么细想,后来看了tourist的代码后得知。

可以证明,满足贪心选择性质和最优子结构性质。

贪心策略是:从前向后遍历,每次选择最小长度的符合条件的段。

 

c.

#include<iostream>
#include<stdio.h>
#include<set>
using namespace std;

#define MAXN 312345

int a[MAXN];

int _start[MAXN];
int _end[MAXN];

int main(){

    int n;
    set<int> existed;
    int cnt;
    int start;

    while(~scanf("%d",&n)){
        existed.clear();

        for(int i=0;i<n;++i){
            scanf("%d",&a[i]);
        }

        cnt=0;
        start=0;
        for(int i=0;i<n;++i){
            if(existed.find(a[i])!=existed.end()){
                _start[cnt]=start;
                _end[cnt]=i;
                ++cnt;

                existed.clear();
                start=i+1;
            }
            else{
                existed.insert(a[i]);
            }
        }

        if(cnt==0){
            printf("-1\n");
        }
        else{
            _end[cnt-1]=n-1;
            printf("%d\n",cnt);
            for(int i=0;i<cnt;++i){
                printf("%d %d\n",_start[i]+1,_end[i]+1);
            }
        }
    }

    return 0;
}
View Code

 

posted @ 2016-01-22 21:40  gongpixin  阅读(382)  评论(0编辑  收藏  举报