创作灵感:整理自己的解题思路
1.1.4 Broken Necklace 破碎的项链
你有一条由N个红色、白色或蓝色珠子随机排列组成的项链(3<=N<=350),下面给出n=29的两个示例:
被认为是1号和2号的珠子在图中已经被给出。
如图A中,brw分别代表蓝色、红色、白色三种珠子,它可以被表示为:brbrrrbbbrrrrrbrrbbrbbbbrrrrb。
假设你要在某个时候折断项链,把它摆直,然后从一端收集相同颜色的珠子,直到你找到一个不同颜色的珠子,对另一端做同样的事情(当然这端收集到的珠子和之前收集的珠子颜色可能不相同)。
你要确定在哪里折断项链以获得最多的珠子。
举例:
对于图A的项链,可以收集最多8颗珠子,在珠子9和珠子10之间断裂,或者在珠子24和珠子25之间断裂。
对于图 B的项链,有一些项链中包含了白色珠子。收集珠子时,遇到的白色珠子可能会被认为是红色或蓝色。
编写一个程序来确定可以从提供的项链中收集的珠子的最大数量。
输入格式:
第1行:N,珠子的数量;
第2行:一个长度为N的字符串包括brw三个字母;
输出格式:
一行一个整数表示最大能收集到的珠子数。
样例1输入:
29 wwwbbrwrbrbrrbrbrwrwwrbwrwrrb
样例1输出:
11
储存:用一个字符数组储存整个项链。
算法的基本思路:断点枚举;
初始化:将数组往后复制一份形成一个2*n长度的数组
算法分析;
先往左边枚举,如果遇到的是白球或者是与上一个颜色相同的球(通过位运算来保证)则继续向右
左边同理
最后将枚举的结果与ans比较,ans被赋为这两个中的最大值。
#include <iostream>
using namespace std;
char s[710];//存放项链
int n=0;//项链长度
int dtmcol(char c)//判断颜色
{
if(c=='b') return 1;
else return 2;
}
int main() {
int ans=0;
cin>>n>>s;//输入项链长度和项链
for(int i=0;i<n;i++) s[i+n]=s[i];//将项链变为2*n长度来处理环
for(int i=0;i<n;i++)
{
int l=i,r=i+n-1;
int cnt=0,left=0,right=0;//cnt==count
while(l<=r&& (s[l]=='w'||(left|dtmcol(s[l]))!=3))//向左枚举
{
if(s[l]!='w') left|=dtmcol(s[l]);
cnt++,l++;
}
while(l<=r&& (s[r]=='w'||(right|dtmcol(s[r]))!=3))//向右枚举
{
if(s[l]!='w') right|=dtmcol(s[r]);
cnt++,r--;
}
ans=ans>cnt?ans:cnt;//比较大小
}
cout<<ans;//输出答案
return 0;
}