usaco/ 1.1 Broken Necklace

本文解析了 USACO Beads 问题的解决思路及 C++ 实现方案,针对特殊情况进行了详细讨论,如全白珠子、单一颜色珠子的情况处理。

原题:http://cerberus.delos.com:790/usacoprob2?a=faHW39gatm8&S=beads

/*
ID: chicc991
PROG: beads
LANG: C++
*/
#include <fstream>
//#include <iostream>

using namespace std;
ifstream fin("beads.in");
ofstream fout("beads.out");

int n;//项链珠子数
char s[350];//代表珠子的数组
int bead();

int main()
{
    fin>>n;
    //cout<<n<<endl;
    fin>>s;
    fout<<bead()<<endl;

    return 0;
}

int bead()
{
    int b[n];
    int max=0;
    int x=0;//保存w的个数,全是w时跳出循环
    for(int i=0; i<n; i++)
    {
        b[i]=s[i];
    }
    for(int i=0; i<n; i++)
    {

        int j=0;
        int m=0;
        int h=0;
        int k=1;

        if(i!=n-1)
            m=i+1;
        if(i!=0)
            h=i-1;
        else h=n;

        //if((b[i]=='w')||(b[h]=='w')||(b[m]=='w'))
        if(b[i]=='w')//全是w则跳出循环,否则结束本次循环
        {
            x++;
            if(x==n)
            {
                max=n;
                break;
            }
            continue;
        }


        while(b[i] != b[m])
        {
            if(m==n-1)
                m=-1;
            j++;
            m++;

        }


        while((b[h]=='w')||(b[i] == b[h]))
        {
            if(h==0)
                h=n;
            k++;
            h--;
            if(k==n)//如果全是红珠子或者蓝珠子,结束循环
            {

                max=n;
                break;
            }
        }
        if(max<(j+k))
            max=j+k;
        if(max>n)//有可能算了2次白珠子,个数最多为总珠子数量
            max=n;
        //cout<<i<<" "<<"j="<<j<<" "<<"k="<<k<<endl;
    }
    return max;
}

注意全是白珠子,全是红珠子,以及连续红蓝珠子串中白珠子被重复计算等特殊情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值