USACO SEC.1.1 No.4 broken necklace
题意:从一个字符串某个字符断开,分别往两个方向数(环), 如果颜色相同则计入总数, 求最多数多少个珠子
解法:简单枚举,每一个结点断开,O(n^2)复杂度,需要一些细节边界处理
/* ID: lsswxr1 PROG: beads LANG: C++ */ #include <iostream> #include <vector> #include <map> #include <list> #include <set> #include <deque> #include <stack> #include <queue> #include <algorithm> #include <cmath> #include <cctype> #include <cstdio> #include <iomanip> #include <cmath> #include <cstdio> #include <string> #include <fstream> using namespace std; ///宏定义 const int INF = 1000000000; const int MAXN = 1010; const int maxn = MAXN; ///全局变量 和 函数 #define USACO #ifdef USACO #define cin fin #define cout fout #endif ////////////////////////////////////////////////////////////////////////// int n; string necklace; int leftTot, rightTot; char leftCor, rightCor; int main() { #ifdef USACO ofstream fout ("beads.out"); ifstream fin ("beads.in"); #endif ////////////////////////////////////////////////////////////////////////// ///变量定义 while (cin >> n) { cin >> necklace; int ans = 2; for (int i = 0; i < n; i++) { leftTot = 1; rightTot = 0; int j = i; int l, r; leftCor = necklace[j % n]; l = (j - 1 + n) % n; rightCor = necklace[(j + 1) % n]; r = (j + 1) % n; //收集左侧 while (l != j) { if (necklace[l] == leftCor || necklace[l] == 'w') { leftTot++; l = (l - 1 + n) % n; continue; } else if (leftCor == 'w' && necklace[l] != 'w') //注意起始颜色如果是w 这个地方很重要,否则答案不对 { leftCor = necklace[l]; leftTot++; l = (l - 1 + n) % n; continue; } break; } //收集右侧 while ((r != (l + 1) % n) ) { if (necklace[r] == rightCor || necklace[r] == 'w') { rightTot++; r = (r + 1) % n; continue; } else if (rightCor == 'w' && necklace[r] != 'w') { rightCor = necklace[r]; rightTot++; r = (r + 1) % n; continue; } break; } ans = max(ans, leftTot + rightTot); } cout << ans << endl; } ///结束 return 0; }