您的位置:首页 > 其它

cf 620C Pearls in a Row(贪心)

2016-01-22 21:40 246 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: