码迷,mamicode.com
首页 > 其他好文 > 详细

usaco1.1.4

时间:2015-10-29 23:08:18      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:

题目描述

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

没什么难的,只有有几个坑点需要注意

1.题目是有环的,即最后一个走完到第一个,第一个走完也可去最后一个

2.枚举每个起点,但起点有可能是w,所以我们应当取左(右)的第一个不是w的数据

3.但如果是全w的数据,就应该特判,退出查找"第一个不是w数据"的过程

4.每个位置只能被查找一个,因此需要一个数组来记录是否被查找过

  1 /*
  2 ID:i_goodboy1
  3 LANG:C++
  4 TASK:beads
  5 */
  6 #include <cstdio>
  7 #include <iostream>
  8 #include <cstring>
  9 using namespace std;
 10 char c[600];
 11 int n;
 12 void read()
 13 {
 14     scanf("%d",&n);
 15     cin>>c;
 16 }
 17 bool u[500];
 18 void solve()
 19 {
 20     int maxn=0,k,l,tt=n>>1,len;
 21     char oo,pp;
 22     bool flag1,flag2;
 23     for(int i=0;i<n;i++)
 24     {
 25         memset(u,false,sizeof(u));
 26         flag1=true;
 27         flag2=true;
 28         len=0;
 29         k=i;
 30         l=i-1;
 31         if(l<0)
 32             l=n-1;
 33         oo=c[k];
 34         pp=c[l];
 35         if(oo==w)
 36         {
 37             int o=0;
 38             while(c[k]==w)
 39             {
 40                 k++;
 41                 if(k==n)
 42                     k=0;
 43                 if(o==n)
 44                     break;
 45                 o++;
 46             }
 47             oo=c[k];
 48             k=i;
 49         }
 50         else if(pp==w)
 51         {
 52             int o=0;
 53             while(c[l]==w)
 54             {
 55                 l--;
 56                 if(l<0)
 57                     l=n-1;
 58                 if(o==n)
 59                     break;
 60                 o++;
 61             }
 62             pp=c[l];
 63             l=i-1;
 64         }
 65         for(int j=0;j<n;j++)
 66         {
 67             if(l<0)
 68                 l=n-1;
 69             if(k>=n)
 70                 k=0;
 71             if((c[k]==oo || c[k]==w) && flag1 && !u[k])
 72             {
 73                 u[k]=true;
 74                 len++;
 75             }
 76             else
 77                 flag1=false;
 78             if((c[l]==pp || c[l]==w) && flag2 && !u[l])
 79             {
 80                 u[l]=true;
 81                 len++;
 82             }
 83             else
 84                 flag2=false;
 85             l--;
 86             k++;
 87         }
 88         if(len>maxn)
 89             maxn=len;
 90     }
 91     cout<<maxn<<endl;
 92 }
 93 int main()
 94 {
 95     freopen("beads.in","r",stdin);
 96     freopen("beads.out","w",stdout);
 97     read();
 98     solve();
 99     return 0;
100 }

 

usaco1.1.4

标签:

原文地址:http://www.cnblogs.com/helloworld-c/p/4921897.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!