该题题意比较简单,有一个首尾相连的字符串,长度给定,从某个位置切断后,从两端开始取字符。规则为只能取颜色与首端珠子颜色相同的珠子,而首端珠子颜色如果是白色(w),就往下遍寻直至不是(w)的珠子作为第一个珠子的颜色。另外白色珠子可以被涂上任意颜色,因此如果遇到白色珠子是必定可以取出的。举例说明:wwwbbrwrbrbrrbrbrwrwwrbwrwrrb。我们把两个字符连在一起,得到新的字符串wwwbbrwrbrbrrbrbrwrwwrbwrwrrb wwwbbrwrbrbrrbrbrwrwwrbwrwrrb。连接字符串后,在1~n个字符中i位置开始切,最后切得的字符串为i~i+n,然后计算得到两端可取出的所有珠子总数。整体遍历一遍所有切点位置,维护更新最大珠子数即可。
#include<bits/stdc++.h>
#include<cstring>
using namespace std;
int main()
{
int n, len = 0, maxn = 0;
bool istaken[710];
string s, ss;
cin>>n; cin>>s;
// 拼接字符串
ss = s; ss = ss+s;
len = n;
for(int i = 0; i < len; i++) {
memset(istaken, false, sizeof(istaken));// 初始化珠子标示
int total = 0, ext = -1;
// 从前往后取
ext = i;// 记录第一个颜色珠ss[ext]位置
while(ss[ext] == 'w') ext++;
for(int j = i; j < i+len; j++) {
if(ss[j] == ss[ext] || ss[j] == 'w') {
total++;
istaken[j] = true;
} else {
break;
}
}
// 从后往前取
ext = i+len-1;
while(ss[ext] == 'w') ext--;
for(int j = i+len-1; j >=i; j--) {
if( (ss[j] == ss[ext] || ss[j] == 'w' ) && !istaken[j]) {
total++;
istaken[j] = true;
} else {
break;
}
}
// 最大值
maxn = max(maxn, total);
}
cout<<maxn<<endl;
return 0;
}
本文介绍了一种串珠游戏的算法实现,通过首尾相连的字符串处理,寻找从任一位置切割后能获取的最大相同颜色珠子数量。文章详细解释了如何通过双指针前后扫描并利用标记数组来高效解决问题。
473

被折叠的 条评论
为什么被折叠?



