洛谷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 }
本文为博主原创文章,转载请注明出处。