Broken Necklace 坏掉的项链 USACO 模拟(易错)

1004: 1.1.4Broken Necklace 坏掉的项链

时间限制: 1 Sec  内存限制: 128 MB
提交: 11  解决: 9
[提交] [状态] [讨论版] [命题人:外部导入]

题目描述

1.1.4Broken Necklace 坏掉的项链 

(beads.pas/c/cpp) 

题目描述 

你有一条由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 。
写一个程序来确定从一条被给出的项链可以收集到的珠子最大数目。 

程序名称

beads 

输入格式

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

样例输入

(文件 beads.in) 

29 
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb

输出格式

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

样例输出

(文件 beads.out) 

11

提示

  
 

来源/分类

 
 
 
天哪简直太惨了 这么简单的一道题竟然调了30分钟 呜呜呜呜
 
先贴代码再讲讲吧  超级无敌复杂代码
我用的是思路2 但是有很多特殊情况没有考虑到
 
1.rwwwwb要是从左往右扫 我一开始的判断是只要s[i]==s[i+1] || s[i]=='w' || s[i+1]=='w'
在这里就不行了 b和上一个w是可以匹配的 但是和一开始的r不一样
所以我就加了
第7-9行那一段就是考虑了上面的特殊情况 找到第一个非w的字母
 
2. bbbb
我之前是从左往右到头扫一遍 反过来从尾到头再扫一遍 答案就出来了8
应该判断如果从左往右扫的时候扫到了头就不用再从右往左扫了
并且从右往左扫只需要到从左往右扫最末到达的那个位置和后一个位置就行了O(∩_∩)O哈哈~
还是不熟练 需要加油啊
代码来啦(特别长)
 
 
 
 
 
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int l,r;
 4 char s[705];
 5 int check(){
 6     int sum=1;
 7     char c;int index=l;
 8     while(s[index]=='w') index++;
 9     c=s[index];
10     int i;
11     for(i=l+1;i<=r;i++){
12         if(s[i]==s[i-1]||s[i]=='w') sum++;
13         else if(s[i-1]=='w'&&s[i]==c) sum++;
14         else break;
15     }
16     int fanwei=i-1;
17     index=r;
18     while(s[index]=='w'&&index>fanwei) index--;
19     c=s[index];
20     if(fanwei==r)
21         return sum;
22     sum++;
23     for(i=r-1;i>fanwei;i--) {
24         if(s[i]==s[i+1]||s[i]=='w') sum++;
25         else if(s[i+1]=='w'&&s[i]==c) sum++;
26         else break;
27     }
28     return sum;
29 }
30 int main(){
31     int len; 
32     cin>>len>>s;    
33     int maxn=-1;
34     l=0;r=len-1;
35     for(int i=1;i<=len;i++)
36     {
37         maxn=max(maxn,check());
38         l++;r++;
39         s[r]=s[l-1];
40     }
41     cout<<maxn;
42 }
原文地址:https://www.cnblogs.com/Tidoblogs/p/11285951.html