zoukankan      html  css  js  c++  java
  • P1203 [USACO1.1]坏掉的项链Broken Necklace

    P1203 [USACO1.1]坏掉的项链Broken Necklace

    题目描述

    你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的。 这里是 n=29 的二个例子:

    第一和第二个珠子在图片中已经被作记号。

    图片 A 中的项链可以用下面的字符串表示:

    brbrrrbbbrrrrrbrrbbrbbbbrrrrb

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

    例如,在图片 A 中的项链中,在珠子 9 和珠子 10 或珠子 24 和珠子 25 之间打断项链可以收集到8个珠子。

    白色珠子什么意思?

    在一些项链中还包括白色的珠子(如图片B) 所示。

    当收集珠子的时候,一个被遇到的白色珠子可以被当做红色也可以被当做蓝色。

    表现含有白珠项链的字符串将会包括三个符号 r , b 和 w 。

    写一个程序来确定从一条被给出的项链可以收集到的珠子最大数目。

    输入输出格式

    输入格式:

    第 1 行: N, 珠子的数目

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

    输出格式:

    输出一行一个整数,表示从给出的项链中可以收集到的珠子的最大数量。

    输入输出样例

    输入样例#1:
    29 
    wwwbbrwrbrbrrbrbrwrwwrbwrwrrb
    
    输出样例#1:
    11

    说明

    题目翻译来自NOCOW。

    USACO Training Section 1.1

    分析:

    直接暴力搜索,O(n*n),复制成3份,从中间段开始搜。

    枚举中间所有点。

     1 #include <iostream>
     2 #include <algorithm>
     3 using namespace std;
     4 string a;
     5 int f(int x)
     6 {
     7     int s=0;
     8     char a1=a[x];
     9     //加上自己,多一次 
    10     char b2=a[x+1];
    11     //往前搜 
    12     for(int i=x;;i--)
    13     {
    14         if(a[i]==a1)s++;
    15         else if(a[i]=='w')
    16             s++;
    17         else
    18             break;
    19     }
    20     //往后搜 
    21     for(int i=x+1;;i++)
    22     {
    23         if(a[i]==b2)s++;
    24         else if(a[i]=='w')
    25             s++;
    26         else
    27             break;
    28     }
    29     return s;
    30 }
    31 int main()
    32 {
    33     int ans,n;
    34     ans=-1;
    35     cin>>n;cin>>a;
    36     a=a+a+a;
    37     for(int i=n;i<2*n;i++)//三段 从中间那一段开始处理
    38     {
    39         //相同不拆 
    40         if(a[i]==a[i+1])
    41             continue;
    42         if(a[i]=='w')//如果是白色,分颜色进行搜索 
    43         {
    44             //当成红色 
    45             a[i]='r';
    46             ans=max(ans,f(i));
    47             //当成蓝色 
    48             a[i]='b';
    49             ans=max(ans,f(i));
    50             //还原成白色 
    51             a[i]='w';
    52         }
    53         //如果是其它颜色,直接进行搜索 
    54         ans=max(ans,f(i));
    55     }
    56     ans=min(ans,n);//最长也不能比总长长
    57     if(ans==-1)ans=n;//出现这种情况必定是一路continue过来的
    58     cout<<ans<<endl;
    59     return 0;
    60 }
  • 相关阅读:
    在ASP.NET AJAX中防止用户多次提交页面
    谈谈对C#委托的理解,附代码实例
    如何用VS2005制作Web安装程序 (转)
    VS2005下BoundField的DataFormatString不起作用了?
    使用XMLHttp在页面间传送参数
    远程连接sql server 2000服务器的解决方案
    JavaScript获取元素在浏览器画布中的绝对位置
    旧神谱
    [转帖]IE经典故障写真
    希腊神话
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/7476666.html
Copyright © 2011-2022 走看看