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;
}

 

posted on 2013-11-15 20:33  小书包_Ray  阅读(172)  评论(0编辑  收藏  举报

导航