题目描述:
嗯这道题的题目照样很好懂。作为section 1.1的守关题,硬要说的话其实比之前确实是要复杂了。好吧,大意就是input一个string,包含了rbw三种character,把他们看成是珍珠,把string看成是项链,然后在项链上打掉一个点,左右方向同时开始收集同一颜色的连续的珠子,看最多有几个。然后红(r),蓝(b)都是正常的,白(w)就是为了增加难度,变成了可看成蓝的可看成白的。
算法思想:
这道题的简单之处就在于只要你从头开始枚举一遍,根本就不用考虑w该选择是红色还是蓝色。
根本不用考虑!!!卧槽简单死我了。
算法的话唯一值得说的就是把string翻一倍接在后面。然后从1一直循环到2n的地方,然后再每一个循环内部开两个循环来检测左右各能收集到多少个。
并且值得注意的是这样的算法有可能超过n,超过n就说明是存在一个break方式让左右收集之后就收集到了所有的珠子,嗯这时候就output n出来就好了。
代码部分:
#include <fstream> #include <iostream> using namespace std; char ca[717]; int main() { ifstream fin("beads.in"); ofstream fout("beads.out"); int n; fin >> n; for (int i = 1; i <= n; i++) { char c; fin >> c; ca[i] = c; ca[i + n] = c; } int res = 0; for (int i = 1; i <= 2*n; ++i) { int a=0,b=0; char c1 = ca[i]; char c2 = ca[i - 1]; for (int k1 = i; k1 <= 2*n; k1++) { if (ca[k1] != 'w' && c1 == 'w') c1 = ca[k1]; if (ca[k1] != c1 && c1 != 'w' && ca[k1] != 'w') { break; } a++; } for (int k2 = i - 1; k2 >= 1; k2--) { if (ca[k2] != 'w' && c2 == 'w') c2 = ca[k2]; if (ca[k2] != c2 && c2 != 'w' && ca[k2] != 'w') { break; } b++; } if (a + b > res) res = a + b; } if (res >= n) fout << n << endl; else fout << res << endl; return 0; }