zoukankan      html  css  js  c++  java
  • 洛谷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

    破环成链,枚举起点模拟就好。

    UPD 2017.7.4

    发现代码有严重bug,一是以白色为起点的时候遇到颜色不一样的就会跳,而是如果整串颜色全一样,正着倒着各扫一遍会算重。

    这样问题很大啊……然而当时A掉了,当时的数据有多弱……

    已修正

     1 /*By SilverN*/
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cmath>
     5 #include<cstring>
     6 #include<algorithm>
     7 #define LL long long
     8 using namespace std;
     9 const int mxn=800;
    10 int read(){
    11     int x=0,f=1;char ch=getchar();
    12     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    13     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
    14     return x*f;
    15 }
    16 int n,a[mxn];
    17 char ch;
    18 int main(){
    19     int i,j;
    20     n=read();
    21     for(i=1;i<=n;i++){
    22         ch=getchar();
    23         if(ch=='w')a[i]=0;
    24         else if(ch=='r')a[i]=1;//
    25             else a[i]=2;//
    26         a[i+n]=a[i]; 
    27     }
    28     int ans=0;
    29     for(int k=1;k<=n;k++){
    30         int tmp1=0,tmp2=0,ed=k+n-1;
    31         bool flag=0;int pos=0;
    32         for(i=k;i<=ed;i++){
    33             ++tmp1;if(a[i])flag=1;
    34             pos=i;
    35             if(flag && a[i+1] && a[i+1]!=a[k])break;
    36         }
    37         flag=0;
    38         for(i=ed;i>pos;i--){
    39             if(a[i])flag=1;
    40             ++tmp2;if(flag && a[i-1] && a[i-1]!=a[ed])break; 
    41         }
    42         ans=max(ans,tmp1+tmp2);
    43     }
    44     cout<<ans<<endl;
    45     return 0;
    46 }

    ——————旧版本——————

     1 /*By SilverN*/
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cmath>
     5 #include<cstring>
     6 #include<algorithm>
     7 #define LL long long
     8 using namespace std;
     9 const int mxn=800;
    10 int n,a[mxn];
    11 char ch;
    12 int main(){
    13     int i,j;
    14     n=read();
    15     for(i=1;i<=n;i++){
    16         ch=getchar();
    17         if(ch=='w')a[i]=0;
    18         else if(ch=='r')a[i]=1;//
    19             else a[i]=2;//
    20         a[i+n]=a[i]; 
    21     }
    22     int ans=0;
    23     for(int k=1;k<=n;k++){
    24         int tmp1=0,tmp2=0,ed=k+n-1;
    25         for(i=k;i<=ed;i++){
    26             ++tmp1;if(a[i+1] && a[i+1]!=a[k])break;
    27         }
    28         for(i=ed;i>=k;i--){
    29             ++tmp2;if(a[i-1] && a[i-1]!=a[ed])break; 
    30         }
    31         ans=max(ans,tmp1+tmp2);
    32     }
    33     cout<<ans<<endl;
    34     return 0;
    35 }
  • 相关阅读:
    zabbix迁移思路
    top命令
    random随机数
    判断传入元素是否可见
    title_contains
    1.Selenium的工作原理以及网页上查找元素
    APP升级测试
    英语词汇
    作文 |素材笔记
    408计组 |二、数据的表示和运算
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/6035410.html
Copyright © 2011-2022 走看看