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 2 1,3 1 2 1
s.很不错的一道贪心的题。当时没怎么细想,后来看了tourist的代码后得知。
可以证明,满足贪心选择性质和最优子结构性质。
贪心策略是:从前向后遍历,每次选择最小长度的符合条件的段。
c.
View Code
比如 是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
相关文章推荐
- STM32下载不成功问题汇总
- 内联函数学习
- 普惠金融上升到国家战略,创业者与农民的福音?(学习后整理,附XIMD)
- Python操作MySQL数据库
- POJ 2187 Beauty Contest(凸包优化 || 凸包+旋转卡壳)
- 设计基于HTML5的APP登录功能及安全调用接口的方式
- 【SSH】——struts2 拦截器
- 为Java说句公道话
- 面向对象技巧之高内聚,低耦合!!!
- OpenGL es gluLookAt 函数
- C语言 printf函数的返回值
- POJ NO.3669 Meteor Shower(经典BPS,,,)
- TCP/IP、Http、Socket的区别
- Java 创建不可变对象-final关键字的使用总结
- 一维/二维动态数组分配(C语言)
- 你不强大,再多人脉也没用
- 使用Maven管理Spring
- Java和C + +有什么区别?
- js局部变量和全局变量
- 九度oj 1437 贪心