5811: 取珠子
时间限制: 1 Sec 内存限制: 128 MB提交: 160 解决: 27
[ 提交][ 状态][ 讨论版][命题人: admin]
题目描述
味味妈妈有一串珠子串成的项链,这个项链中的珠子最多有 3 种颜色(红、蓝、白, 分别用 r、b、w 表示)。某天,味味想从妈妈项链中取出一些珠子来玩,妈妈虽然答应了, 但提出了以下条件:
(1)只能在项链中选择一个地方剪断,然后从断开的两端开始依次取出珠子;
(2)每一端取珠子时,如果珠子颜色与该端第一颗珠子颜色相同则可以连续取下去, 直到出现一颗与该端第一颗颜色不同的珠子。如果遇到白色珠子则可根据需要看做蓝色或者 红色。
味味对于颜色并没有特殊要求,但她想得到尽可能多的珠子。
为方便表示,我们给项链中的珠子按顺时针方向编号,如图-1 和图-2 所示为两种可能的项链情况(珠子都有 11 颗)。
对于图-1 来说,如果在 1 和 2 号珠子之间剪断,则味味可以取到共 2 颗珠子。而如果 在 6 和 7 号珠子之间剪断,则味味可以取到共 5 颗珠子(左边取 3 颗红色 r,右边取 2 颗 蓝色 b),而 5 颗珠子也是味味从这串项链中最多可以取到的珠子数量。
对于图-2 中的项链来说,如果在 1 和 2 号珠子之间剪断,则共可取走 4 颗珠子(将 1 号珠子当做蓝色,这样左边可取 3 颗,右边可取 1 颗蓝色 b)。而如果在 2 和 3 号之间剪断, 则共可取走 6 颗珠子(将 1 号珠子当做蓝色,这样左边可取 4 颗蓝色 b,右边可取 2 颗红 色 r)。
(1)只能在项链中选择一个地方剪断,然后从断开的两端开始依次取出珠子;
(2)每一端取珠子时,如果珠子颜色与该端第一颗珠子颜色相同则可以连续取下去, 直到出现一颗与该端第一颗颜色不同的珠子。如果遇到白色珠子则可根据需要看做蓝色或者 红色。
![](http://exam.upc.edu.cn/upload/image/20180226/20180226154505_96672.png)
为方便表示,我们给项链中的珠子按顺时针方向编号,如图-1 和图-2 所示为两种可能的项链情况(珠子都有 11 颗)。
对于图-1 来说,如果在 1 和 2 号珠子之间剪断,则味味可以取到共 2 颗珠子。而如果 在 6 和 7 号珠子之间剪断,则味味可以取到共 5 颗珠子(左边取 3 颗红色 r,右边取 2 颗 蓝色 b),而 5 颗珠子也是味味从这串项链中最多可以取到的珠子数量。
对于图-2 中的项链来说,如果在 1 和 2 号珠子之间剪断,则共可取走 4 颗珠子(将 1 号珠子当做蓝色,这样左边可取 3 颗,右边可取 1 颗蓝色 b)。而如果在 2 和 3 号之间剪断, 则共可取走 6 颗珠子(将 1 号珠子当做蓝色,这样左边可取 4 颗蓝色 b,右边可取 2 颗红 色 r)。
输入
输入共包含二行。第一行一个整数 n,表示项链中珠子的总数。第二行为 一串长度为 n 的字符,由字符 r,b,w 组成。表示项链从某个珠子开始按顺时针方向展开 的珠子排列情况(当然,这个珠子并不一定是味味实际需要剪断的位置)。
输出
输出仅包含一行一个数值,表示按照妈妈的规则,味味最多能得到的珠子数量。
样例输入
11
wbrrbbwbrbb
样例输出
6
提示
将 1 号珠子看成蓝色,则在 2 和 3 号珠子之间剪断,味味可得到的 6 颗珠子编号分别为1、2、3、4、10、11;也可在 4 和 5 号珠子间剪断,将 7 号珠子看成蓝色,则味味可得到珠子的编号为 3、4、5、6、7、8。
对于 60%的数据 3≤n≤100
对于 100%的数据 3≤n≤350
来源
以下代码有BUG(此题十分诡异),但能AC,仅供参考
#include<stdio.h>
#include<string.h>
char a[400];
int judge(int n)
{
for(int i=0;i<n-1;i++)
if(a[i]!=a[i+1])
return 0;
return 1;
}
int main()
{
int n, ans, maxn=0;
scanf("%d%s", &n, a);
if(judge(n))
maxn=n;
else
for(int i=0;i<n-1;i++)
{
if(a[i]!=a[i+1])
{
ans=0;
int temp1=i, temp2=i+1;
while(a[temp1]=='w')
temp1=(temp1-1+n)%n;
a[i]=a[temp1];
temp1=i;
while(a[temp2]=='w')
temp2=(temp2+1)%n;
a[i+1]=a[temp2];
temp2=i+1;
while(a[temp1]==a[i] || a[temp1]=='w')
{
ans++;
temp1=(temp1-1+n)%n;
}
while(a[temp2]==a[i+1] || a[temp2]=='w')
{
ans++;
temp2=(temp2+1)%n;
}
if(ans>maxn)
maxn=ans;
}
}
printf("%d\n", maxn);
return 0;
}
/**************************************************************
Problem: 5811
User: ldu_reserver201701
Language: C++
Result: 正确
Time:0 ms
Memory:1092 kb
****************************************************************/