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

 

题目描述

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

第一和第二个珠子在图片中已经被作记号。

图片 A 中的项链可以用下面的字符串表示:

brbrrrbbbrrrrrbrrbbrbbbbrrrrb

假如你要在一些点打破项链,展开成一条直线,然后从一端开始收集同颜色的珠子直到你遇到一个不同的颜色珠子,在另一端做同样的事(颜色可能与在这之前收集的不同)。 确定应该在哪里打破项链来收集到最大数目的珠子。

例如,在图片 A 中的项链中,在珠子 9 和珠子 10 或珠子 24 和珠子 25 之间打断项链可以收集到8个珠子。

白色珠子什么意思?

在一些项链中还包括白色的珠子(如图片B) 所示。

当收集珠子的时候,一个被遇到的白色珠子可以被当做红色也可以被当做蓝色。

表现含有白珠项链的字符串将会包括三个符号 r , b 和 w 。

写一个程序来确定从一条被给出的项链可以收集到的珠子最大数目。

输入输出格式

输入格式:

第 1 行: N, 珠子的数目

第 2 行: 一串长度为N的字符串, 每个字符是 r , b 或 w。

输出格式:

输入输出样例

输入样例#1:
29 
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb
输出样例#1:
11

说明

题目翻译来自NOCOW。

USACO Training Section 1.1

破环成链,枚举起点模拟就好。

UPD 2017.7.4

发现代码有严重bug,一是以白色为起点的时候遇到颜色不一样的就会跳,而是如果整串颜色全一样,正着倒着各扫一遍会算重。

这样问题很大啊……然而当时A掉了,当时的数据有多弱……

已修正

 1 /*By SilverN*/
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<cstring>
 6 #include<algorithm>
 7 #define LL long long
 8 using namespace std;
 9 const int mxn=800;
10 int read(){
11     int x=0,f=1;char ch=getchar();
12     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
13     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
14     return x*f;
15 }
16 int n,a[mxn];
17 char ch;
18 int main(){
19     int i,j;
20     n=read();
21     for(i=1;i<=n;i++){
22         ch=getchar();
23         if(ch=='w')a[i]=0;
24         else if(ch=='r')a[i]=1;//
25             else a[i]=2;//
26         a[i+n]=a[i]; 
27     }
28     int ans=0;
29     for(int k=1;k<=n;k++){
30         int tmp1=0,tmp2=0,ed=k+n-1;
31         bool flag=0;int pos=0;
32         for(i=k;i<=ed;i++){
33             ++tmp1;if(a[i])flag=1;
34             pos=i;
35             if(flag && a[i+1] && a[i+1]!=a[k])break;
36         }
37         flag=0;
38         for(i=ed;i>pos;i--){
39             if(a[i])flag=1;
40             ++tmp2;if(flag && a[i-1] && a[i-1]!=a[ed])break; 
41         }
42         ans=max(ans,tmp1+tmp2);
43     }
44     cout<<ans<<endl;
45     return 0;
46 }

——————旧版本——————

 1 /*By SilverN*/
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<cstring>
 6 #include<algorithm>
 7 #define LL long long
 8 using namespace std;
 9 const int mxn=800;
10 int n,a[mxn];
11 char ch;
12 int main(){
13     int i,j;
14     n=read();
15     for(i=1;i<=n;i++){
16         ch=getchar();
17         if(ch=='w')a[i]=0;
18         else if(ch=='r')a[i]=1;//
19             else a[i]=2;//
20         a[i+n]=a[i]; 
21     }
22     int ans=0;
23     for(int k=1;k<=n;k++){
24         int tmp1=0,tmp2=0,ed=k+n-1;
25         for(i=k;i<=ed;i++){
26             ++tmp1;if(a[i+1] && a[i+1]!=a[k])break;
27         }
28         for(i=ed;i>=k;i--){
29             ++tmp2;if(a[i-1] && a[i-1]!=a[ed])break; 
30         }
31         ans=max(ans,tmp1+tmp2);
32     }
33     cout<<ans<<endl;
34     return 0;
35 }
原文地址:https://www.cnblogs.com/SilverNebula/p/6035410.html