usaco 1-1-4 Broken Necklace

来源:互联网 发布:linux查看tcp连接ip 编辑:程序博客网 时间:2024/06/06 05:43

usaco 持续更新中


nocow友情翻译

Broken Necklace 坏掉的项链

目录

 [隐藏] 
  • 1 描述
  • 2 格式
  • 3 样例输入
  • 4 样例输出


描述

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

假如你要在一些点打破项链,展开成一条直线,然后从一端开始收集同颜色的珠子直到你遇到一个不同的颜色珠子,在另一端做同样的事(颜色可能与在这之前收集的不同)。 确定应该在哪里打破项链来收集到最大数目的珠子。
例如,在图片 A 中的项链中,在珠子 9 和珠子 10 或珠子 24 和珠子 25 之间打断项链可以收集到8个珠子。

白色珠子什么意思?

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


格式

PROGRAM NAME: beads

INPUT FORMAT:

(file beads.in)

  • 第 1 行: N, 珠子的数目
  • 第 2 行: 一串长度为N的字符串, 每个字符是 r , b 或 w。

OUTPUT FORMAT:

(file beads.out)

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


样例输入

29 wwwbbrwrbrbrrbrbrwrwwrbwrwrrb


样例输出

11

分析:这个比较难搞,因为他的首尾相连,st(本人)采用每次都将第一颗放到最后一个的做法


解释代码:

/*ID:jwb11931LANG:CTASK:beads*/#include<stdio.h>#include<string.h>int max,al,i,j,sum,p[400],p1[400];char a[750],flag,flag1;int main(){freopen("beads.in","r",stdin);freopen("beads.out","w",stdout);scanf("%d",&al);getchar();scanf("%s",a);max=0;for(i=0;i<al;i++){//这里相当于将每种情况枚举,也就是从哪里断开sum=0;for(j=0;j<al;j++){p[j]=0;p1[j]=0;}if(i!=0)a[al+i-1]=a[i-1];//当前首珠放末尾flag='w';flag1='w';for(j=i;j<=al+i-1;j++){//开始对每一颗珠子不同颜色进行处理(下面凑合着看吧。。。)if(a[j]==flag||a[j]=='w' ){//如果珠子为第一颗珠子的颜色即flag或为白,标记if(j>=al)p[j-al]=1;else p[j]=1;}else {if(flag=='w'){//如果颜色还是默认的,证明这是第一颗珠,flag置为他的颜色且标记flag=a[j];if(j>=al)p[j-al]=1;else p[j]=1;}else break;}}for(j=al+i-1;j>=i;j--){//同时对末端开始处理,方法同上(现在知道我为何用数组标记吧,去重)if(a[j]==flag1||a[j]=='w'){if(j>=al)p1[j-al]=1;else p1[j]=1;}else{ if(flag1=='w'){flag1=a[j];if(j>=al)p1[j-al]=1;else p1[j]=1;}else break;}}for(j=0;j<al;j++){if(p[j]+p1[j]>0)sum++;}if(sum>max)max=sum;}printf("%d\n",max);return 0;}


下面是copy党福利(裸码):

/*ID:LANG:CTASK:beads*/#include<stdio.h>#include<string.h>int max,al,i,j,sum,p[400],p1[400];char a[750],flag,flag1;int main(){freopen("beads.in","r",stdin);freopen("beads.out","w",stdout);scanf("%d",&al);getchar();scanf("%s",a);max=0;for(i=0;i<al;i++){sum=0;for(j=0;j<al;j++){p[j]=0;p1[j]=0;}if(i!=0)a[al+i-1]=a[i-1];flag='w';flag1='w';for(j=i;j<=al+i-1;j++){if(a[j]==flag||a[j]=='w' ){if(j>=al)p[j-al]=1;else p[j]=1;}else {if(flag=='w'){flag=a[j];if(j>=al)p[j-al]=1;else p[j]=1;}else break;}}for(j=al+i-1;j>=i;j--){if(a[j]==flag1||a[j]=='w'){if(j>=al)p1[j-al]=1;else p1[j]=1;}else{ if(flag1=='w'){flag1=a[j];if(j>=al)p1[j-al]=1;else p1[j]=1;}else break;}}for(j=0;j<al;j++){if(p[j]+p1[j]>0)sum++;}if(sum>max)max=sum;}printf("%d\n",max);return 0;}


看在我如此认真的份上,真心求赞求访问求评论!!!

1 0
原创粉丝点击