一尘不染

项链断裂问题中的错误答案USACO

algorithm

断项链

您有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 red bead
                    b blue bead
                    w white bead

图片中标记了以下文字中第一和第二个珠子。

图A中的配置可以表示为b和r的字符串,其中b代表蓝色的珠子,r代表红色的珠子,如下所示:brbrrrbbbrrrrrbrrbbrbbbbbrrrrb。

假设您要折断项链,将其笔直摆放,然后从一端收集相同颜色的珠子,直到到达另一种颜色的珠子,然后在另一端进行相同的操作(这可能不是与之前收集的珠子颜色相同)。

确定应该折断项链的位置,以便可以收集最多数量的珠子。

例如,对于图A中的项链,可以收集8个珠子,其断裂点在珠子9和珠子10之间,或者在珠子24和珠子25之间。

如上图B所示,在某些项链中还包括白色珠子。收集珠子时,遇到的白色珠子可以当作红色或蓝色,然后涂上所需的颜色。表示此配置的字符串将包括三个符号r,b和w。

编写程序以确定可以从提供的项链中收集的最大珠子数量。

输入格式

第1行:N,珠子的数量第2行:由N个字符组成的字符串,每个字符为r,b或w

29 wwwbbrwrbrbrrbrbrwrwwrbwrwrrb

输出格式

单行包含可从随附项链中收集的最大珠子数量。

11

输出说明

考虑两个副本的珠子(有点像能够绕过两端)。字符串11被标记。

            Two necklace copies joined here

wwwbbrwrbrbrrbrbrwrwwrbwrwrrb | wwwbbrwrbrbrrbrbrwrwwrbwrwrrb

                    ******|*****

                    rrrrrb|bbbbb  <-- assignments

                5xr .....#|#####  6xb

                    5+6 = 11 total

这是我遇到的USACO培训问题;我一直得到不正确的答案。…而且请不要告诉我这是愚蠢或愚蠢的;这没有帮助!:D


阅读 221

收藏
2020-07-28

共1个答案

一尘不染

嘿,我可以解决这个问题,但是我没有为它编写代码的麻烦。无论如何,我的 想法 是这样。

首先,您不需要存储所有的珠子颜色(Go澳大利亚拼写!),只需存储连续多少个相同颜色的珠子。因此对于:

RRBBBWRR

您只需要存储:

2R 3B 1W 2R

要注意的一件事是,如果末尾珠和起始珠子的颜色相同,则必须考虑这一点,因此

RRBBBRR

应该存储为

4R 3B
or
3B 4R

一样。请注意,这样做的原因不是节省内存或其他任何东西,而是确保彼此相邻的珠子是不同的颜色。我们通过组合相同颜色的珠子来做到这一点。

接下来,您要遍历每一个:
-如果是红色,则将所有颜色加起来,直到找到蓝色,然后继续添加,直到找到另一个红色
-如果它是蓝色,则除反转外应进行类似操作
-如果是白色,则下一个珠子将是红色或蓝色。除添加白色珠子数量外,执行上述操作

这里有些例子。序列开始和结束的|标记。

B|RB|R

我们找到一个R,然后一个B,再找到另一个R。因此,我们必须在B处停止。

B|RWRB|R

我们找到一个R,然后找到另一个R,但是我们还没有找到B,因此我们继续。然后我们找到一个B,然后找到另一个R。这一次,因为我们找到了B,所以我们必须停止。

B|RBW|R

我们找到一个R,然后找到一个B,但是由于下一个是W,我们可以继续,然后找到另一个R,所以我们必须停止。在

B|WRBWB|R

我们计算W然后找到R。因此,我们继续直到找到B,然后继续直到找到另一个R。

B|WBRWR|B

是相反的情况。

现在,您要做的就是实现它:D。当然,这没有考虑到R,B和W中实际珠子的数量,而仅仅是单个珠子序列的示例。您将必须检查所有可能的顺序。您还必须注意从头到尾环绕的序列。

最后,您可能会注意到该算法有时很浪费,但N<350,因此即使O(N^3)也应在1秒钟内起作用。也许是2。无论如何,我相信这是O(N ^2),所以您应该能够 _在一秒钟内_运行该程序350次。如果有什么令人困惑的地方,请发表评论,因为我不是最好的解释者。快乐的编码。

2020-07-28