P1203 [USACO1.1]坏掉的项链Broken Necklace
这道题虽然是是普及-,
part 1
由于高等语法没有学过 种种原因 (自己太弱了),我还是选择了能让你们简单易懂的 比较简单的循环遍历。大佬搞的什么队列还是算了吧。。。
for(int i = 0;i < a;i++){
ans = 0;//要清零
frontchar = necklace[i];//frontchar 就是从这颗往后的珠子的总数
if(i == 0)//这里要特判,因为有可能 i = 0
lastchar = necklace[a - 1];
else
lastchar = necklace[i - 1];
part 2
如果出现 w 怎么办呢?往下看
if(frontchar == 'w' || lastchar == 'w'){/*这里还需要特判, 因为有一组样例是
17
wwwwwwwwwwwwwwwww
输出就会出现 0 , 会 wrong answer */
for(int j = i;j < 355;j++){
if(j >= a)//这一句是重置数组
j = 0;
if(necklace[j] != 'w'){
frontchar = necklace[j];
break;
}
if(j == i && i == 0 && s > 0){//由于如果全是 w 会出现无限循环 , 所以要特判
cout << a << endl;
return 0;
}
s++;
}
for(int j = i - 1;j < 355;j--){
if(j < 0)
j = a - 1;
if(necklace[j] != 'w'){
lastchar = necklace[j];
break;
}
}//frontchar 和 lastchar 的特判
}
不要问我输入样例在哪里看到的 USACO
part 3
非常 简单易懂
or(int j = i;j < 355;j++){
if(j >= a)
j = 0;
if(necklace[j] == frontchar || necklace[j] == 'w')
ans++;
else
break;
if(i == 0 && j == a - 1){
cout << a << endl;
return 0;
}//同样 , 如果全是b 或者 r, 也会TLE
}
for(int j = i - 1;j < 355;j--){
if(j < 0)
j = a - 1;
if(necklace[j] == lastchar || necklace[j] == 'w')
ans++;
else
break;
}// ans 往前和往后的计数
if(ans <= a)
rans = max(rans, ans);
}
complete code
#include <bits/stdc++.h>
using namespace std;
int main() {
string necklace;
char frontchar, lastchar;
int a, ans, rans = 0, s = 0;
cin >> a >> necklace;
for(int i = 0;i < a;i++){//从这里循环每一颗珠子找到这颗珠子和前一颗
ans = 0;//要清零
frontchar = necklace[i];//frontchar 就是从这颗往后的珠子的总数
if(i == 0)//这里要特判,因为有可能 i = 0
lastchar = necklace[a - 1];
else
lastchar = necklace[i - 1];
if(frontchar == 'w' || lastchar == 'w'){/*这里还需要特判, 因为有一组样例是
17
wwwwwwwwwwwwwwwww
输出就会出现 0 , 会 wrong answer */
for(int j = i;j < 355;j++){
if(j >= a)//这一句是重置数组
j = 0;
if(necklace[j] != 'w'){
frontchar = necklace[j];
break;
}
if(j == i && i == 0 && s > 0){//由于如果全是 w 会出现无限循环 , 所以要特判
cout << a << endl;
return 0;
}
s++;
}
for(int j = i - 1;j < 355;j--){
if(j < 0)
j = a - 1;
if(necklace[j] != 'w'){
lastchar = necklace[j];
break;
}
}//frontchar 和 lastchar 的特判
}
for(int j = i;j < 355;j++){
if(j >= a)
j = 0;
if(necklace[j] == frontchar || necklace[j] == 'w')
ans++;
else
break;
if(i == 0 && j == a - 1){
cout << a << endl;
return 0;
}//同样 , 如果全是b 或者 r, 也会TLE
}
for(int j = i - 1;j < 355;j--){
if(j < 0)
j = a - 1;
if(necklace[j] == lastchar || necklace[j] == 'w')
ans++;
else
break;
}// ans 往前和往后的计数
if(ans <= a)
rans = max(rans, ans);
}
cout << rans << endl;
return 0;
}
第一次写文章,如有不妥,请多多包容,不喜勿喷。
点击获取洛谷题目位置