题解 P1203 【[USACO1.1]坏掉的项链Broken Necklace】

[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));
}

原文地址:https://www.cnblogs.com/Randolph68706/p/12127441.html

时间: 2024-10-20 12:02:15

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

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

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

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

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

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

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

坏掉的项链Broken Necklace

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

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

1004: 1.1.4Broken Necklace 坏掉的项链 时间限制: 1 Sec  内存限制: 128 MB提交: 11  解决: 9[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 1.1.4Broken Necklace 坏掉的项链 (beads.pas/c/cpp) 题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 1 2 1 2 r b b r b r r b r b b b

磁盘坏掉了??关于磁盘被破坏的一些简单修复

关于磁盘被破坏的一些简单修复,不过楼主这里没有条件真正的将磁盘拔出修复,所以采用了现行复制的方法(如果没有备份可以通过相同磁盘的文件来修复) 1.这里我先把磁盘信息做了一个备份在其他机器上,因为没有相同磁盘,就借此演示(不过没有备份也可以修复,后面会有关于没有备份修复的方法) 2.备份完成后破坏掉原来的磁盘 3.进入救援模式(因为磁盘空间已经被破坏,所以在重新启动后根本不需要任何操作便会进入这个页面,因为系统已经默认使用光盘来启动了) 4.在救援模式下我们将被破坏的磁盘部分拷贝回来.(到这里问题

centos出现磁盘坏掉,怎么修复和检测。

当dmesg的时候,出现下面的信息说明磁盘有问题 Info fld=0x139066d0 end_request: I/O error, dev sda, sector 328230608 Buffer I/O error on device sda, logical block 41028826 sd 0:0:0:0: SCSI error: return code = 0x08000002 sda: Current: sense key: Medium Error Add. Sense: U

Ambari 节点坏掉不要的节点 无法删除解决方法

1.配置一台和坏掉的节点一样的ip和 hostname 2.安装ntp服务(根据自己时间同步方案安装情况而定) 使时间同步 3.安装 ambari-agent 可以去我共享了一个地址下载: https://pan.baidu.com/s/1bpi46Hh 密码: 3p2b rpm -ivh ambari-agent-2.4.2.0-136.x86_64.rpm #安装完成后 手动修改配置文件 配置 agent-server所在地址 vi /etc/ambari-agent/conf/ambari

数据库硬盘坏掉!!!

在这里,给大家做个警示,数据库硬盘硬盘,尽量做RAID或其他磁盘阵列! 环境:win server 2008 Enterprise 64位.硬盘:SSD(系统盘)+ 2T(数据盘) 出现的问题:2T数据盘,一会在系统中显示,一会又不显示,一会又显示.根本就没法用了(硬盘中的数据都在!). 解决方法:1.重 启系统,不管用2.把2T的数据盘,插在另一台机器上,还是出现相同的症状.猜想可能数据库硬盘由于大量的IO操作,导致硬盘出现问题.3.在另一台服务器上,把前几天的备份(bak文件)导入到另一个数