USACO1.1 Broken Necklace 比較分析

注:此題感覺我是因爲小學數學沒學好就被繞進去了,而且這個珠子裏有陷阱:(然後我就死了。再加上這週一直在玩QT就一直停在這兒了。 
此題關鍵就是把每一段給求出來。 
代碼來自:http://blog.sina.com.cn/s/blog_ad13c2900101knl1.html 
因爲確實暫時沒做出來,只能貼出上邊博客裏的代碼。待仔細研究後但願能自己寫出來吧TAT

你有一串由紅珠子、白珠子和藍珠子組成的項鍊,珠子的數量大於等於3小於等於350.珠子隨機排列。

下邊是兩個例子:

                1 2                               1 2

           r b b r                          b r r b

         r         b                       b         b

        r           r                     b           r

       r             r                   w             r

      b               r                 w               w

     b                 b               r                 r

     b                 b               b                 b

     b                 b               r                 b

      r               r                 b               r

       b             r                   r             r

        b           r                     r           r

          r       r                         r       b

            r b r                             r r w

           Figure A                        Figure B

                        r red bead

                        b blue bead

                        w white bead

 

第一個珠子和第二個珠子的位置在圖上標出來了。圖Figure A 中的排列可表示爲brbrrrbbbrrrrrbrrbbrbbbbrrrrb。

如果你在某個點把這串項鍊弄斷,然後把它拉直。然後一直收集一種顏色的珠子,直到遇到另一個顏色。一直這麼做直到把把這串項鍊的珠子找完。

確定斷點位置保證最大數量的珠子能夠被收集到。

*白珠子既可以被看做藍珠子也可以被看作紅珠子。

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    ifstream fin("beads.in");
    ofstream fout("beads.out");

    int before,after;
    int n;
    int p = 0;
    char necklace[800];
    char current_color;
    int max = 0;

    fin>>n;
    fin >> necklace;

    for(int i = 0;i < n;i ++)
        necklace[i+n] = necklace[i];
    necklace[n*2] = '\0';

    before = 0;
    while(necklace[p] == 'w')
    {
        before++;
        p++;
    }
    current_color = necklace[p];
    while((necklace[p] == current_color|| necklace[p] == 'w') && p<n)
    {
        before++;
        p++;
    }
    if(p < n)
    {
       while(p < 2*n)
        {
            current_color = necklace[p];
            after = 0;
            while(necklace[p] == current_color|| necklace[p] == 'w')
            {
                after++;
                p++;
            }
            if(before + after > max && before+after <= n)
            {
                max = before+after;
            }
            before = after;
            int j = p-1-before;
            while(necklace[j] == 'w')
            {
                before++;
                j--;
            }
        }
    }
    else
        max = n;
    fout << max<<endl;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章