USACO1.1 Broken Necklace 比较分析

来源:互联网 发布:sql server授予权限 编辑:程序博客网 时间:2024/06/03 03:26

注:此题感觉我是因为小学数学没学好就被绕进去了,而且这个珠子里有陷阱:(然后我就死了。再加上这周一直在玩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;}


0 0