USACO Section 1.1 Broken Necklace

题目描述

你有一条项链为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中的配置可以表示为b和r的串,其中b表示蓝色珠,r表示红色,如下所示:brbrrrbbbrbrrrrrbrrbbrbbbbrrrrbb。
假设你要在某个时候打破项链,把它直接放下,然后从一端收集相同颜色的珠子,直到达到不同颜色的珠子,并对另一端做同样的事情(这可能不是 与之前收集的珠相同的颜色)。
确定项链应该破碎的点,以便可以收集最多的珠子。

例子

例如,对于图A中的项链,可以收集8个珠粒,破坏点在珠粒9和珠粒10之间,或者在珠粒24和珠粒25之间。
在一些项链中,已经包括白色珠子,如上图B所示。 当收集珠子时,遇到的白色珠子可以被视为红色或蓝色,然后用所需的颜色涂上。 表示此配置的字符串可以包括三个符号r,b和w中的任何一个。
写一个程序来确定从提供的项链可以收集的最大数量的珠子。

程序名称:beads

输入格式

线1:N,珠数
第2行:一串N个字符,每个字符都是r,b或w

输入(file beads.in)
29
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb

输出格式
包含从提供的项链中可以收集的最多珠数的单行。

输出(file beads.out)
11

输出说明

       考虑两个珠子的副本(类似于能够绕过端部)。 标记为11的字符串。
                                   两个项链的副本加入了这里

                                                     v
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb|wwwbbrwrbrbrrbrbrwrwwrbwrwrrb
                                             ******|*****
                                              rrrrrb|bbbbb  <-- assignments
                                         5xr .....#|#####  6xb
                                                    5+6 = 11 总共

解题思路

本题主要思路是暴力枚举把字符串复制一遍接在数组尾部,用以模拟环,然后从第一个不是w的地方开始穷举所有的可能。变量before中记录的是断点前同色珠子的数量,after是断点后同色珠子的数量。其中特别要考虑的就是两种情况,第一种情况就是全是一个颜色导致的重复;第二种情况就是因为两个字符串中重复的地方重复计算最终导致其长度大于n的情况因此(before+after<=n)

解题代码

/*
ID: 15189822
PROG: beads
LANG: C++
*/
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
ifstream fin("beads.in");
ofstream fout("beads.out"); 
int main(){
    int before,after;
    int n;
    int p=0;
    char necklace[800];
    char current_color;
    int max = 0; 
    fin>>n;
    fin>>necklace;
    for(int i=0;i<n;i++)
        necklace[i+n]=necklace[i];
    necklace[n*2]='\0';
    before=0;
    while(necklace[p]=='w'){
        before++;
        p++;
    }
    current_color=necklace[p];
    while((necklace[p]==current_color||necklace[p]=='w')&&p<n){
        before++;
        p++;
    }
    if(p<n){
       while(p<2*n){
            current_color=necklace[p];
            after=0;
            while(necklace[p]==current_color||necklace[p]=='w'){
                after++;
                p++;
            }
            if(before+after>max&&before+after<=n){
                max=before+after;
            }
            before=after;
            int j=p-1-before;
            while(necklace[j]=='w'){
                before++;
                j--;
            }
        }
    }
    else max=n;
    fout<<max<<endl;
    return 0;
}

本题本人有一点不懂,借鉴了网上的代码,思路。

猜你喜欢

转载自blog.csdn.net/YanLucyqi/article/details/72773619