2739 - D . Broken Necklace

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的。 这里是 n=29 的二个例子:

                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
             图片 A                             图片  B
                 
                         r 代表 红色的珠子      
                             b 代表 蓝色的珠子   
                             w 代表 白色的珠子

第一和第二个珠子在图片中已经被作记号。

图片 A 中的项链可以用下面的字符串表示:

 brbrrrbbbrrrrrbrrbbrbbbbrrrrb

假如你要在一些点打破项链,展开成一条直线,然后从一端开始收集同颜色的珠子直到你遇到一个不同的颜色珠子,在另一端做同样的事(颜色可能与在这之前收集的不同)。 确定应该在哪里打破项链来收集到最大数目的珠子。<br />

例如,在图片 A 中的项链中,在珠子 9 和珠子 10 或珠子 24 和珠子 25 之间打断项链可以收集到8个珠子。

<b>白色珠子什么意思?</b>

在一些项链中还包括白色的珠子(如图片B) 所示。<br />

当收集珠子的时候,一个被遇到的白色珠子可以被当做红色也可以被当做蓝色。
表现含有白珠项链的字符串将会包括三个符号 r , b 和 w 。
写一个程序来确定从一条被给出的项链可以收集到的珠子最大数目。

题目输入

多组测试数据。

第 1 行: N, 珠子的数目

第 2 行: 一串长度为N的字符串, 每个字符是 r , b 或 w。

题目输出

单独的一行 最大可能取得的珠子数。

输入/输出样例

输入格式

29 
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb

输出格式

11

C语言解答

#include<stdio.h>
int main()
{
    int i,k,j,o,n,sum,x,y,p,q;
    char a[10000],g,f;
    while(scanf("%d",&n)!=EOF)
    {
        sum=0;
        scanf("%s",a);
		for(i=0;i<n;i++)
		{
			a[i+n]=a[i];
		}
        for(i=n;i<=2*n;i++)
        {
			k=x=y=p=q=0;
            for(j=i;j<=2*n;j++)
            {
			    if(a[j]!='w')
				{
                	f=a[j];
					break;
				}
			}
			for(o=i-1;o>=0;o--)
            {
			    if(a[o]!='w')
				{
                	g=a[o];
					break;
				}
			}
			if(g!=f)
			{
				for(j=i;j<2*n;j++)
				{
			        if(a[j]=='w'||a[j]==f)
					    k++;
			    	else
				    	break;
				}
                for(o=i-1;o>=0;o--)
				{
			        if(a[o]=='w'||a[o]==g)
					    k++;
				    else
					    break;
				}
			}
            else
			{
				for(j=i;j<2*n;j++)
				{
			        if((a[j]=='w'||a[j]==f)&&p==0)
					    k++;
			    	else
					{
				    	x++;
						p=1;
						if(a[j+1]==f)
							break;
					}
				}
				for(o=i-1;o>=0;o--)
				{
			        if((a[o]=='w'||a[o]==g)&&q==0)
					    k++;
				    else
					{
						y++;
						q=1;
						if(a[o-1]==g)
							break;
					}
				}
				if(x>y)
					k=k+x;
				else
					k=k+y;
			}
            if(k>sum)
            sum=k;
        }
		if(sum>n)
			sum=n;
        printf("%d\n",sum);
    }
    return 0;
}

C++解答

/*
ID:wangzhe30
LANG:C
PROG:beads
*/
#include <stdio.h>
int main()
{
	int n;
	//freopen("beads.in","r",stdin);
	//freopen("beads.out","w",stdout);
	while(scanf("%d",&n)!=EOF)
	{
	    int k[350]={0},i,t,max=0,f=0,p,h;
        char beads[700]={0};
	    scanf("%s",beads);
        for(i=0;i<n;i++)
            beads[i+n]=beads[i];
        for(i=0;i<n;i++)
        {
            p=i;
            f=0;
            for(t=0;t<n;t++)
            {
                if(beads[p]=='w' && f==0)
                {
                    k[i]++;
                    p++;
                    continue;
                }
                if((beads[p]==beads[p+t])||(beads[p+t]=='w'))
                {
                    f=1;
                    k[i]++;
                }
                else
                    break;
            }
            f=0;
            p=n+i-1;
            for(h=0;h<n-t;h++)
            {
                if(beads[p]=='w' && f==0)
                {
                    k[i]++;
                    p--;
                    continue;
                }
                if((beads[p]==beads[n+i-1-h])||(beads[n+i-1-h]=='w'))
                {
                    f=1;
                    k[i]++;
                }
                else
                    break;
            }
        }
        for(i=0;i<n;i++)
            if (max<k[i])
                max=k[i];
        printf("%d\n",max);
	}
	return 0;
}