cf 620C Pearls in a Row(贪心)

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

比如 是1 2 1 3 1 2 1

那么 答案是

21 34 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;
}

时间: 2024-10-05 06:44:07

cf 620C Pearls in a Row(贪心)的相关文章

Codeforces 620C EDU C.Pearls in a Row ( set + greed )

C. Pearls in a Row There are n pearls in a row. Let's enumerate them with integers from 1 to n from the left to the right. The pearl number i has the type ai. Let's call a sequence of consecutive pearls a segment. Let's call a segment good if it cont

CF(437C)The Child and Toy(贪心)

题意:给出一个无向图,每个点有点权,操作是一个一个将所有点揪走直至剩下一个点,揪走一个点的代价是剩下点中与其连边的点的点权和.求完成操作所需花费的最小代价. 解法:贪心的思想,每次将剩余点中点权最大的点揪出,这样可以保证每条边都是会选择相对小的点权被消耗掉.所以直接输出所有边的边权和即可. 代码: /****************************************************** * author:xiefubao **************************

Pearls in a Row CodeForces 620C 水题

题目:http://codeforces.com/problemset/problem/620/C 文章末有一些测试数据仅供参考 题目大意:就是给你一个数字串,然后将分成几个部分,要求每个部分中必须有一对儿相等的数字,每个数字都属于某个部分,输出划分的部分数量以及对应区间. 很简单一道题,输入的数据都不用存的,输入一个检测一个就好了,用map打标记,用容器存一下要输出的区间端点值,最后挨个儿输出就好了 代码如下: #include<iostream> #include<map> #

[ 10.03 ]CF每日一题系列—— 534B贪心

Descripe: 贪心,贪在哪里呢-- 给你初始速度,结尾速度,行驶秒数,每秒速度可变化的范围,问你行驶秒数内最远可以行驶多少距离 Solution: 贪心,我是否加速,就是看剩下的时间能不能减到原始给定的结尾速度 #include <iostream> using namespace std; int main() { int v1,v2; int t,d; while(cin>>v1>>v2) { cin>>t>>d; int ret =

cf Learn from Life (简单贪心)

有N个人站在一楼.一个电梯最多承载K个人. 每个人都有一个想去的楼层.f[1]....f[N]. f[i]属于[2,2000] 从a层到b层需花费abs(a-b)秒. 问电梯送完所有人然后回到一楼至少需要多少秒. 思路: 把每个人想去的楼层从小到大排序. 先把高层的人送完再送低层的人,每次送K个.(证明:送最高层的那个人的那一趟(完整)至少需要**时间,在这一趟中“顺带”把去次K-1高层楼的人送完) 代码: int n,k; int f[2005]; int main(){ scanf("%d%

cf Make It Nondeterministic (简单贪心)

有N个人.每个人都有两个名字. 给出这N个人的一个排列.p[1]...p[N]. 现在让每个人挑自己丙个名字中的一个名字.问是否存在一种方案,使得挑出来的N个名字按字典序排完以后正好是p[1]...p[N]. 思路: 按照p[1]..p[N]的顺序挑第p[i]个人名字中小的(要大于第p[i-1]个人挑出来的名字),若不行,则挑另一个.若另一个名字也不大于第p[i-1]个人挑出来的名字,就输出NO. 不多说,直接看代码. 代码: int n; string name1[100005]; strin

Educational Codeforces Round 6

620A - Professor GukiZ's Robot    20171122 \(ans=max(\left | x2-x1 \right |,\left | y2-y1 \right |)\) #include<stdlib.h> #include<stdio.h> #include<math.h> #include<cstring> #include<iostream> #include<algorithm> using

cassandra的schema version, gossip_generation 和host id

这是cassandra里面很重要的三个值; schema version是cassandra cluster里每个node的schema版本,什么叫版本呢?因为cassandra是无中心化的,所以你很难知道所有的node上的schema是否是一致的.你不可能每次把所有的schema都拿了去比较一次.这样很不高效.所以cassandra里就有了schema version这个概念.每次执行DDL操作的时候,都会新生成一个新的schema version, 当这个DDL操作复制到其他node的时候,

【转】cache buffer chain 第一篇

文章转自:http://www.jydba.net/cache-buffer-chain/ buffer cache的管理有两个重要的数据结构: hash bucket和cache buffer chain 1. hash bucket和cache buffer chain 可以想象,如果所有的buffer cache中的所有buffer都通过同一个结构来进行管理,当需要确定某个 block在buffer中是否存在时,将需要遍历整个结构,性能会相当低下. 为了提高效率,oracle引入了buck