【♂Not The Triumph♂O(∩_∩)O哈哈~But The Struggle♂】

竞赛决不是捷径,它只是另一种艰辛的生活方式。得到与失去,只有时间会去评判;成功与失败,只有历史能去仲裁。我不会永远成功,正如我不会永远失败一样

  C++博客 :: 首页 :: 联系 ::  :: 管理
  6 Posts :: 239 Stories :: 25 Comments :: 0 Trackbacks

常用链接

留言簿(7)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 108434
  • 排名 - 229

最新评论

阅读排行榜

评论排行榜

你有一条由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
Figure A                         Figure B               

                     r 代表 红色的珠子     

                     b 代表 蓝色的珠子  

                     w 代表 白色的珠子

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

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

brbrrrbbbrrrrrbrrbbrbbbbrrrrb . 

假如你要在一些点打破项链,展开成一条直线,然后从一端开始收集同颜色的珠子直到你遇到一个不同的颜色珠子,在另一端做同样的事。(颜色可能与在这之前收集的不同) 确定应该在哪里打破项链来收集到最大多数的数目的子。 Example 举例来说,在图片 A 中的项链,可以收集到8个珠子,在珠子 9 和珠子 10 或珠子 24 和珠子 25 之间打断项链。 在一些项链中,包括白色的珠子如图片 B 所示。 当收集珠子的时候,一个被遇到的白色珠子可以被当做红色也可以被当做蓝色。 表现项链的字符串将会包括三符号 r , b 和 w 。 写一个程序来确定从一条被供应的项链最大可以被收集珠子数目。 

PROGRAM NAME: beads

INPUT FORMAT 

第 1 行:

N, 珠子的数目 

第 2 行:

一串度为N的字符串, 每个字符是 r , b 或 w。 

SAMPLE INPUT (file beads.in) 

29 

wwwbbrwrbrbrrbrbrwrwwrbwrwrrb 

OUTPUT FORMAT 

单独的一行包含从被供应的项链可以被收集的珠子数目的最大值。 

SAMPLE OUTPUT (file beads.out) 

11


【参考程序】:
/*
ID: XIONGNA1
PROG: beads
LANG: C++
*/
#include
<stdio.h>
#include
<stdlib.h>
#include
<string.h>
int b1[702],r1[702],b2[702],r2[702];
int n;char ch[702];
int mx(int a,int b)
{
    
if (a>b) return a;
    
else return b;
}
int main()
{
    freopen(
"beads.in","r",stdin);
    freopen(
"beads.out","w",stdout);
    scanf(
"%d",&n);getchar();
    
for (int i=1;i<=n;i++) scanf("%c",&ch[i]);
    
for (int i=1;i<=n;i++) ch[i+n]=ch[i];
    b1[
0]=r1[0]=0;
    
for (int i=1;i<=n;i++)
        
if (ch[i]=='b')
        {
            b1[i]
=b1[i-1]+1;r1[i]=0;
        }
        
else if (ch[i]=='r')
        {
            b1[i]
=0;r1[i]=r1[i-1]+1;
        }
        
else 
        {
            b1[i]
=b1[i-1]+1;r1[i]=r1[i-1]+1;
        }
    b2[
2*n+1]=r2[2*n+1]=0;
    
for (int i=2*n;i>=1;i--)
        
if (ch[i]=='b')
        {
            b2[i]
=b2[i+1]+1;r2[i]=0;
        }
        
else if (ch[i]=='r')
        {
            b2[i]
=0;r2[i]=r2[i+1]+1;
        }
        
else 
        {
            b2[i]
=b2[i+1]+1;r2[i]=r2[i+1]+1;
        }
    
int ans=0;
    
for (int i=1;i<=2*n;i++)
        ans
=mx(mx(b1[i],r1[i])+mx(b2[i+1],r2[i+1]),ans);
    
if (ans>n) ans=n;
    printf(
"%d\n",ans);
    
return 0;
}
posted on 2009-07-16 15:20 开拓者 阅读(663) 评论(0)  编辑 收藏 引用 所属分类: USACO 题解

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理