Broken Necklace

破碎的项链 Broken Necklace 破碎的项链 Broken Necklace.cpp 自 信 地 说 这 道 题 我 做 过 ——————————————分割线—————————————————— 从中间开始,然后找到第三个点(是w)。 第三个点变r和b往前后各看一遍。 最后最长也不能比总长长 #include<bits/stdc++.h> using namespace std; string a; int f(in... 阅读详情

You have a necklace of N red, white, or blue beads (3<=N<=350) some of which are red, others blue, and others white, arranged at random. Here are two examples for n=29:

                1 2                               1 2
            r b b r                           b r r b
          r         b                       b         b
         r           r                     b           r
        r             r                   w             r
       b               r                 w               w
      b                 b               r                 r
      b                 b               b                 b
      b                 b               r                 b
       r               r                 b               r
        b             r                   r             r
         b           r                     r           r
           r       r                         r       b
             r b r                             r r w
            Figure A                         Figure B
                        r red bead
                        b blue bead
                        w white bead

The beads considered first and second in the text that follows have been marked in the picture.

The configuration in Figure A may be represented as a string of b’s and r’s, where b represents a blue bead and r represents a red one, as follows: brbrrrbbbrrrrrbrrbbrbbbbrrrrb .

Suppose you are to break the necklace at some point, lay it out straight, and then collect beads of the same color from one end until you reach a bead of a different color, and do the same for the other end (which might not be of the same color as the beads collected before this).

Determine the point where the necklace should be broken so that the most number of beads can be collected.

Example

For example, for the necklace in Figure A, 8 beads can be collected, with the breaking point either between bead 9 and bead 10 or else between bead 24 and bead 25.

In some necklaces, white beads had been included as shown in Figure B above. When collecting beads, a white bead that is encountered may be treated as either red or blue and then painted with the desired color. The string that represents this configuration can include any of the three symbols r, b and w.

Write a program to determine the largest number of beads that can be collected from a supplied necklace.

INPUT FORMAT

Line 1: N, the number of beads
Line 2: a string of N characters, each of which is r, b, or w

SAMPLE INPUT

29
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb

OUTPUT FORMAT

A single line containing the maximum of number of beads that can be collected from the supplied necklace.

SAMPLE OUTPUT

11

OUTPUT EXPLANATION

Consider two copies of the beads (kind of like being able to runaround the ends). The string of 11 is marked.

                Two necklace copies joined here
                             v
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb|wwwbbrwrbrbrrbrbrwrwwrbwrwrrb
                       ******|*****
                       rrrrrb|bbbbb  <-- assignments
                   5xr .....#|#####  6xb

                        5+6 = 11 total

题意理解:

这道题看的我起初是有点懵的,不知道到底是要得到一个什么值,当然可能是英语能力的问题。后面研究它的8是如何得来的,就明白了,大概的意思是这样:有一串串了N颗珠子(其中颜色有红、蓝、白)项链,要从一个地方剪开这条项链变成一条直链,从直链的两端开始收集珠子,白色珠子可以被视为是红色或者蓝色的,遇到不同颜色的就停止,最后把两边所得的值加起来,就是收集的总珠子数目,求这个数的最大值。

设计算法:

起初还没看EXPLANATION的想法是这道题就等同于不剪开项链求其中一段(该段只有红、蓝、白两种颜色,且红、蓝只有一个分割处)的珠子数的最大值,但是想来并没有什么可以表示一个环的办法,后面不经意看到了解释,确实是个妙计,把一个直链再加上它本身就可以达到遍历环的效果了,然后直接暴力搜索。

C++编写:

原始代码(能过,稍微有点复杂):

/*
ID: your_id_here
TASK: beads
LANG: C++                 
*/
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;

int solve(int n,string a)
{
    a+=a;
    int max_len=1;
    for(int i=0;i<n;i++)
    {
        int max1=1;
        char t=a[i];
        if(t == 'w')
        {
            int rec=0;
            for(int j=i+1;j<n+i;j++)
            {
                if(a[j] == t || a[j] == 'w')
                {
                    max1++;
                } 
                else
                {
                    rec++;
                    if(rec<3)
                    {
                        max1++;
                        t=a[j];
                    }
                    else
                        break;
                }      
            }
        }
        else 
        {
            int rec=0;
            for(int k=i+1;k<n+i;k++)
            {
                if(a[k] == t || a[k] == 'w')
                {
                    max1++;
                } 
                else
                {
                    rec++;
                    if(rec<2)
                    {
                        max1++;
                        t=a[k];
                    }
                    else
                        break;
                }      
            }
        }
        max_len=max(max_len,max1);
    }
    cout<<max_len<<endl;
}

int main()
{
    freopen("beads.in","r",stdin);
    freopen("beads.out","w",stdout);

    int N;
    string necklace;
    cin>>N>>necklace;
    solve(N,necklace);
    return 0;
}

之后去看了一下别人的代码,确实是可以优化的:

/*
ID: your_id_here
TASK: beads
LANG: C++                 
*/
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;

int solve(int n,string a)
{
    
    int max_len=0,count,rec;
    a+=a;
    for(int i=0;i<n;i++)
    {
        char t=a[i];
        if(t=='w')
            rec=0;
        else
            rec=1;

        count=1;
        int j=i+1;
        while(rec<3)
        {
            while(j<n+i && (a[j] == t || a[j] == 'w'))
            {
                count++;
                j++;
            }
            rec++;
            t=a[j];
        }  
        max_len=max(max_len,count);
    }
    cout<<max_len<<endl;
}

int main()
{
    freopen("beads.in","r",stdin);
    freopen("beads.out","w",stdout);

    int N;
    string necklace;
    cin>>N>>necklace;
    solve(N,necklace);
    return 0;
}
使用动态规划算法解决Broken Necklace Broken Necklace你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3,珠子是随意安排的。 这里是 n=29 的二个例子:第一和第二个珠子在图片中已经被作记号。 图片 A 中的项链可以用下面的字符串表示: brbrrrbbbrrrrrbrrbbrbbbbrrrrb . 假如你要在一些点打破项链,展开成一条直线,然后从一端开始收集同颜色的珠子直到你遇到一个不同 阅读详情

相关推荐

Usaco 1.1.4 破碎的项链(Broken Necklace)

题目:  破碎的项链 来源:  Usaco1.1.4 题目大意:  一个长度为N,由w、r、b字母组成的长链,w=r或者b,求从哪里断开可以向左向右得  到最长的一条有相同字母组成的链 数据范围:

慢慢前行,跨越预言 785

USACO - Chapter1 Section 1.1 - Broken Necklace

Broken Necklace

zhuo1ang的博客 470

[USACO 1.1.4] Broken necklace 解答

题目: 你有一条由 N 个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里 是 n=29 的二个例子 : 1 2 1 2 r b b r b r r b r b b b r r

Aression的博客 621

【USACO】1.1.4 Broken Necklace 破碎的项链

假设你要在某个时候折断项链,把它摆直,然后从一端收集相同颜色的珠子,直到你找到一个不同颜色的珠子,对另一端做同样的事情(当然这端收集到的珠子和之前收集的珠子颜色可能不相同)。如图A中,brw分别代表蓝色、红色、白色三种珠子,它可以被表示为:brbrrrbbbrrrrrbrrbbrbbbbrrrrb。对于图A的项链,可以收集最多8颗珠子,在珠子9和珠子10之间断裂,或者在珠子24和珠子25之间断裂。收集珠子时,遇到的白色珠子可能会被认为是红色或蓝色。编写一个程序来确定可以从提供的项链中收集的珠子的最大数量。

2302_79770546的博客 546

Broken Necklace(参考解析)

很容易看懂的usaco上的代码实现。希望对大家有帮助

USACO题目Broken Necklace (beads)及代码解析

USACO题目Broken Necklace (beads)及代码解析

[usaco]Broken Necklace题解

题目: 给出一个字符串,示意为一串项链(闭合的),长度为n,r表示红色珠子,b表示蓝色,w表示白色(可蓝可红),从任意一处切开,从两端点开始分别取相同颜色的珠子,并求珠子的最大值。(不同的切法有不同的两端,而因为是最大值,显然两端的颜色是不同的) 样例: 输入: 29 wwwbbrwrbrbrrbrbrwrwwrbwrwrrb 输出: 11 分析:从最后1,2个之间切开则左侧wrw

xcwhkh的博客 650

Skyworks SKY85331-11的Wi-Fi 6 (802.11ax)标准 2.4G 高功率WLAN前端模块解决方案

SKY85331-11是高度集成的2 GHz前端模块(FEM)包含2 GHz单刀双掷(SPDT)发送/接收(T / R)开关,2 GHz低噪声放大器(LNA)带旁路和一个2 GHz功率放大器(PA),用于大功率802.11ax应用程序和系统LNA和PA禁用功能可确保低漏电流 关闭模式。 包括一个集成的功率检测器以提供系统内的闭环功率控制。该设备提供Small (24-pin, 3 x 5 mm) (LGA)封装。 图1.引脚配置和封装如图所示 图2.信号引脚分配和功能引脚描述 图...

zhangbao19890622的博客 4504

USACO TRAINING - PROB Broken Necklace

本文记录的是USACO练习题-Broken Necklace题目descriptionYou have a necklace of N red, white, or blue beads (3<=N<=350) some of which are red, others blue, and others white, arranged at random. Here are two examples

BIG BOAT的博客 294

samba源码编译安装(版本4.13.0)

这里写目录标题前言编译安装samba下载三个包安装依赖共需要安装samba、gnutls、nettle1、进入解压后的samba目录执行:2、进入解压后的gnutls目录执行3、进入解压后的nettle目录执行3.1 卸载已存在nettle3.2 编译3.3 make3.4 安装4、进入gnutls继续编译4.1 编译4.2 make4.3 安装5、再次进入解压后的samba目录5.1 执行./configure5.2 make5.3 samba安装启动samba 前言 一般来说,安装samba最快的方式应

灵葱的博客 1万+

测试用例经典练习之微信发红包测试用例

微信发红包测试用例

ZCYaiCLX3344的博客 1万+

USACO 1.2 Broken Necklace

USACO 1.2 Broken Necklace 题目 见落谷 分析 这是第一道开始有点麻烦的USACO的题目。朴素的想法是模拟数珠子的过程,遍历一边就可以得到最终答案了,但是 有几个坑要考虑好(好像USACO本身设计的案例还是很简单的),比如全白珠子,或是重叠数了白珠子。看了官方解 还有dp的解法,真是orz,先上个人的解,有时间再研究一下官方的。 代码 注释处...

蟋蟀的博客 254

常见的十大量化投资策略(附源码)

量化投资策略是利用量化的方法,进行金融市场的分析、判断和交易的策略、算法的总称。著名的量化投资策略有以下10种(注:策略源码模板不能直接用于实盘交易,仅供探讨交流) 01、海龟交易策略 海龟交易策略是一套非常完整的趋势跟随型的自动化交易策略。这个复杂的策略在入场条件、仓位控制、资金管理、止损止盈等各个环节,都进行了详细的设计,这基本上可以作为复杂交易策略设计和开发的模板。 海龟交易策略源码:https://www.myquant.cn/docs/python_strategyies/110 0.

小壁虎的春天 2万+

[USACO Training] Broken Necklace (DP)

Broken Necklace 题目大意: 有一串项链,有红色(r),白色(w),蓝色(b)组成,现在从任意位置把项链断开,从断开的两头分别向项链中间遍历。以左端为例,如果左端第一个为红色,那么从左开始取出所有红色,直到碰到蓝色停止。问最多可以从这串项链中取走多少珠子。(白色既可以当做红色,也可以当做蓝色) 解题思路: O(N^2) 由于珠子数不多,最多350颗。那我们可以用纯暴

SIOFive的专栏 1265

✔B【AD623】【单运放】仪表放大器 AD623电压放大器模块可调 单电源 单端/差分 微小信号

【】仪表放大器 AD623电压放大器模块可调 单电源 单端/差分 微小信号

童话与梦的博客 8279

《QGIS快速入门与应用基础》223:纸张大小与方向(A4/A3/自定义)

本文详细介绍了QGIS布局页面设置的核心操作,重点讲解了纸张大小与方向的设置方法。文章首先指出页面设置是地图排版的基础前提,强调合理设置可避免导出打印时出现尺寸不符等问题。随后详细说明了三种打开页面设置面板的方式,并重点解析了纸张设置的要点:标准预设纸张(A4/A3等)适用于大多数场景,提供国内常用规格对照表;自定义纸张则需谨慎使用,需注意单位选择和尺寸限制。通过界面标注图和操作步骤示意图,帮助用户掌握正确的设置方法,确保最终出图符合规范要求。文章特别提醒新手要优先使用标准预设纸张,避免常见错误,为后续地图

LuckyHanMo的博客 344

USACO Broken Necklace

USACO Broken Necklace 1. 算法:从一个节点开始,假如是r,如果下一个是r或者w,继续,一直到下一个为b为止,然后从b开始看下一个,如果是b或者w,继续,如果是r停止,处理“环”的问题,用了求余,可以使结尾的下一个变成第一个,但是要注意,最后结...

dayong9372的博客 167

IMX6ULL---从零开始移植uboot-imx

IMX6ULL---从零开始移植uboot-imx

weixin_42162924的博客 1028

USACO-Section1.1 Broken Necklace

2017-05-25题目大意:你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的。 这里是 n=29 的二个例子: 1 2 1 2 r b b r b r r b r b

Jane_96的博客 510

【芯片设计- RTL 数字逻辑设计入门 番外篇6 -- 术语 Tile 介绍】

在系统级芯片(System on Chip, SoC)设计中,“tile” 是一个可以指代不同概念的术语,但通常它指的是芯片上的一个独立的功能单元或核心。一个 tile 可以包含一个或多个处理器核心、缓存、内存控制器、输入输出设备、外设接口或其他功能模块。在 SoC 上,多个 tile 可以被组合和连接起来,以形成一个完整的系统。

CodingCos的博客 3065

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

[LuoguP1203][USACO1.1]P1203 Broken Necklace

Solution 这道题数据规模奇小,因此大部分人都使用了暴力搜索的方法,这也是我一开始的想法。 对于 100100%100 的数据,3≤n≤3503≤n≤3503≤n≤350 的确可以如此,但暴力搜索的方法也需要进行一些奇怪的判断,因此我又决定直接打dp的解法,其实dp也是很自然的一种想法…… Dynamic Programming 我们可以发现,每个点向左向右,取蓝色取红色能连续取的个数一...

The Clouder's 292

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

P1203 [USACO1.1]坏掉的项链Broken Necklace

题目描述你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3&lt;=N&lt;=350),珠子是随意安排的。 这里是 n=29 的二个例子:第一和第二个珠子在图片中已经被作记号。图片 A 中的项链可以用下面的字符串表示:brbrrrbbbrrrrrbrrbbrbbbbrrrrb假如你要在一些点打破项链,展开成一条直线,然后从一端开始收集同颜色的珠子直到你遇到一个不同的颜色珠子,在另一端做同样...

Ant_e_zz的博客 438

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

USACO - 1.1.4 - Broken Necklace

USACO - 1.1.4 - Broken Necklace 题目很好懂,思路也很清晰,不就是暴力找断点然后正反各跑一遍,但是这个白色珠子的设定卡了我一上午,连样例都没有过,后来去参考别人的代码,发现了一种已经被我遗忘的处理方法,就是把字符串再加一遍,这样就比我之前写的这个题的代码要更好操作了 有一些细节,需要进行处理,比如如果是白色珠子开头或者为结尾,就要让它变成最近的珠子的颜色,这样才能保证从头到尾或者从尾部到头,尽可能的有最大连续相同颜色的珠子 大部分解释,都以注释的形式写在代码里了 #includ

CUCUC1的博客 222

[USACO1.1]坏掉的项链Broken Necklace

题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3&lt;=N&lt;=350),珠子是随意安排的。 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号。 图片 A 中的项链可以用下面的字符串表示: brbrrrbbbrrrrrbrrbbrbbbbrrrrb 假如你要在一些点打破项链,展开成一条直线,然后从一端开始收集同颜色的珠子直到你遇到一个不同的...

Every Master was once a disaster or beginner. 298

USACO1.1.4 Broken Necklace 破碎的项链

一.题目要求 Broken Necklace You have a necklace of N red, white, or blue beads (3 1 2 1 2 r b b r b r r b

ge_rui_jun的专栏 1604

broken necklace

题目: Broken Necklace You have a necklace of N red, white, or blue beads (3 1 2 1 2 r b b r b r r b r b b b r r b r r r w r b r w w b b r r b b b b b b r b r r b r b r r r b r r r r r

u013496346的专栏 1002
上一篇: Friday the Thirteenth
下一篇: Milking Cows
Slatter
博客等级 码龄8年 104粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值