Z_trening - 204
最编程
2024-01-17 17:36:24
...
该题题意比较简单,有一个首尾相连的字符串,长度给定,从某个位置切断后,从两端开始取字符。规则为只能取颜色与首端珠子颜色相同的珠子,而首端珠子颜色如果是白色(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;
}
下一篇: 配置nginx,upstream服务器