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

22892 破碎的项链

方法一:很容易想到枚举断点,再分别两头找,但是要注意很多细节

#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
string s;
int n,l,r,ll,rr,tmp,ans;
inline int calc(int x) {
ll=s[x],rr=s[x+1],l=x-1,r=x+2;
if (rr=='w') {//如果是w,需分类讨论(如10 rwrwbwrwrw,答案为10,去掉后输出9)
rr='r',tmp=x+2;
while((s[tmp]=='w' || s[tmp]==rr) && tmp<x+n) tmp++;
rr='b';
}
while((s[l]=='w' || s[l]==ll) && l>x-n) l--;
while((s[r]=='w' || s[r]==rr) && r<x+n) r++;
return max(r,tmp)-l-1;
}
int main() {
cin>>n>>s;
s=s+s+s;
for (int i=n; i<n+n; i++)//复制了三段,从中间一段枚举断点
if (s[i]!=s[i+1] && s[i]!='w')//当s[i]==s[i+1]时,在i+1计算比在i更优
ans=max(ans,calc(i));
if (s[n+n-1]==s[n+n]) ans=max(ans,calc(n+n-1));//如果都是同一颜色,则最后一个答案没有计算(如3 rrr,去掉min答案就变成0)
printf("%d",min(ans,n));//如果都是同一颜色,则结果不应超过n,(如3 rrr,去掉min答案就变成5)
}

方法二:一边做一边统计答案(思路来自这个博客

#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
char s[700],c;
int n,l,r,w,ans;
/*
l:左段长度,r:右段长度
w:连续w段的长度
c:当前段的颜色
*/
int main() {
scanf("%d%s",&n,s);
memcpy(s+n,s,n);
for (int i=0; i<n<<1; i++)
if (s[i]=='w') w++,r++;
else if (s[i]==c) w=0,r++;
else ans=max(ans,l+r),l=r-w,r=w+1,w=0,c=s[i];
//这里不能写为l=r,r=1,要把w段给右边,这样在下次修改答案时l更大
//如:bwrrb,遇到第一个r时应当把w给右边,即l=r-w=1,r=w+1=2,这样到第二个b时l更新为3
//而如果用l=r=2,r=1, 第二个b时l更新为2(把开头的w舍去了)
printf("%d",min(max(ans,l+r),n));
}

方法三:dp(思路来自这个博客

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n,lb[701],lr[701],rb[701],rr[701],ans;//l[i]不包括i,r[i]包括i
char s[701];
int main() {
scanf("%d%s",&n,s),memcpy(s+n,s,n),n<<=1;
for (int i=1; i<n; i++)
if (s[i-1]=='b') lb[i]=lb[i-1]+1;
else if (s[i-1]=='r') lr[i]=lr[i-1]+1;
else lb[i]=lb[i-1]+1,lr[i]=lr[i-1]+1;
for (int i=n-2; i>=0; i--)
if (s[i]=='b') rb[i]=rb[i+1]+1;
else if (s[i]=='r') rr[i]=rr[i+1]+1;
else rb[i]=rb[i+1]+1,rr[i]=rr[i+1]+1;
for (int i=0; i<n; i++)
ans=max(ans,max(lb[i],lr[i])+max(rb[i],rr[i]));
printf("%d",min(ans,n>>1));
}

题解 P1203 【[USACO1.1]坏掉的项链Broken Necklace】的更多相关文章

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

    P1203 [USACO1.1]坏掉的项链Broken Necklace不错的断环为链的模拟题,开成三倍,有很多细节要考虑,比如总长度要<=n,开头第一个是w等等. #include<bi ...

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

    坏掉的项链Broken Necklace 难度:★ Code: #include <iostream> #include <cstdio> #include <cstri ...

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

    题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...

  4. AC日记——[USACO1.1]坏掉的项链Broken Necklace 洛谷 P1203

    题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...

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

    题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...

  6. 【P1203】 【USACO1.1】坏掉的项链Broken Necklace

    P1203 [USACO1.1]坏掉的项链Broken Necklace 题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 ...

  7. [USACO1.1.4]坏掉的项链Broken Necklace

    P1203 [USACO1.1]坏掉的项链Broken Necklace 标签 搜索/枚举 USACO 难度 普及- 题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N&l ...

  8. USACO Training Section 1.1 坏掉的项链Broken Necklace

    题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...

  9. Broken Necklace 坏掉的项链 USACO 模拟(易错)

    1004: 1.1.4Broken Necklace 坏掉的项链 时间限制: 1 Sec  内存限制: 128 MB提交: 11  解决: 9[提交] [状态] [讨论版] [命题人:外部导入] 题目 ...

随机推荐

  1. sql 根据查询的记录生成序号的几种方式

    row_number()  order() 函数会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用row_number函数时必须要用over子句选择对某一列进行排序才能生成序号. ra ...

  2. PHP 计算当前时间是这一年的第几周

    $week = intval(date('W',time()));

  3. python如何安装Jupyter notebook

    一,安装Jupyter notebook 环境:win10,python3.7 两种安装方式,这里只讲pip安装 pip install jupyter notebook 二,启动Jupyter no ...

  4. Vue的H5页面唤起支付宝支付

    目前项目中比较常用的第三方支付无非就是支付宝支付和微信支付.下面介绍一下Vue中H5页面如何使用支付宝支付.其实很简单的,只不过是调自己后台的一个接口而已(后台根据支付宝文档,写好支付接口). 触发支 ...

  5. 安装 browsercookie 模块详细步骤

    在安装browsercookie时遇到了不少问题,现在终于解决了,把方法分享下,希望能帮大家节约点时间 到此网址上下载压缩包: https://pypi.org/project/browsercook ...

  6. 最新Idea激活码,持续更新

    更新时间2020-01-10,亲测可用. 激活码老是失效,太麻烦,选择永久激活的方法,此方法,只针对Idea2019.2.1以及之前版本的. 附上链接: https://www.cnblogs.com ...

  7. pygame 运行心理学问卷

    import pygame import sys from pygame.locals import * # wait for keys to putdown def waitForKeys(keys ...

  8. Linux网络课程学习第二天

    第二天学习日志: 今天的课程主要内容: 详细介绍了如何安装红帽RHEL7的系统,并对RPM,Yum,Systemd和bash进行了简单介绍.

  9. 题解 AT4164 【[ABC102A] Multiple of 2 and N】

    首先我们先来回忆一下小学一年级就学过的知识:任何一个偶数都是 \(2\) 的倍数,那么我们就可以分成两种情况考虑:奇数和偶数. 对于偶数,我们可以直接将其输出,因为它必定能被 \(2\) 与它自己整除 ...

  10. Pikachu-over permission(越权操作)

    如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限,如果能够成功操作,则称之为越权操作. 越权漏洞形成的原因是后台使用了 不合理的权限校验规则导致的. 一般越权漏洞容易出现在权限页面(需要登 ...