zoukankan      html  css  js  c++  java
  • Broken Necklace

    Description

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

    Input

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

    Output

    单独的一行包含从被供应的项链可以被收集的珠子数目的最大值。

    Sample Input

    29 
    wwwbbrwrbrbrrbrbrwrwwrbwrwrrb
    

    Sample Output

    11


      因为数据量比较小,所以对于每一个字母向前向后遍历一遍即可,注意的是对于白色珠子的处理,这个题对于标记状态的处理还是有些要求的。

      1 #include<cstdio>
      2 #include<cstdlib>
      3 #include<cstring>
      4 #include<string>
      5 #include<cmath>
      6 #include<algorithm>
      7 #include<queue>
      8 #include<stack>
      9 #include<deque>
     10 #include<map>
     11 #include<iostream>
     12 using namespace std;
     13 typedef long long  LL;
     14 const double pi=acos(-1.0);
     15 const double e=exp(1);
     16 const int N = 10;
     17  
     18 char con[400];
     19 int sum[400];
     20 int main()
     21 {
     22     int n,i,p,j;
     23     int mid=0,most=0,flag;
     24     scanf("%d",&n);
     25     scanf(" %s",con);
     26     for(i=0; i<n; i++)
     27     {
     28         mid=1;
     29         flag=0;
     30         for(j=i+1; j<n; j++)
     31         {
     32             if(mid==n)
     33                 break;
     34             if((con[i]!='w')||(flag==1))
     35             {
     36                 if(con[j]=='w')
     37                     mid++;
     38                 else if(con[j]==con[i])
     39                     mid++;
     40                 else
     41                 {
     42                     mid++;
     43                     break;
     44                 }
     45             }
     46             else
     47             {
     48                 if(mid>=n)
     49                     break;
     50                 if(con[j]!='w')
     51                 {
     52                     mid++;
     53                     flag=1;
     54                     con[i]=con[j];
     55                 }
     56                 else
     57                     mid++;
     58             }
     59         }
     60         sum[i]=mid;
     61         if(flag==1)
     62             con[i]='w';
     63     }
     64     for(i=0; i<n; i++)
     65     {
     66         p=i-1;
     67         mid=1;
     68         flag=0;
     69         if(p==-1)
     70             p=n-1;
     71         for(j=p-1;; j--)
     72         {
     73             if(j==-1)
     74                 j=n-1;
     75             if(mid>=n)
     76                 break;
     77             if((con[p]!='w')||(flag==1))
     78             {
     79                 if(con[j]=='w')
     80                     mid++;
     81                 else if(con[j]==con[p])
     82                     mid++;
     83                 else
     84                 {
     85                     mid++;
     86                     break;
     87                 }
     88             }
     89             else
     90             {
     91                 if(con[j]!='w')
     92                 {
     93                     mid++;
     94                     con[p]=con[j];
     95                     flag=1;
     96                 }
     97                 else
     98                     mid++;
     99             }
    100         }
    101         if(flag==1)
    102             con[p]='w';
    103  
    104         sum[i]+=mid;
    105         if(sum[i]>=n)
    106             sum[i]=n;
    107         if(sum[i]>most)
    108             most=sum[i];
    109     }
    110     printf("%d
    ",most);
    111     return 0;
    112 }
    View Code
  • 相关阅读:
    HDU 5912 Fraction (模拟)
    CodeForces 722C Destroying Array (并查集)
    CodeForces 722B Verse Pattern (水题)
    CodeForces 722A Broken Clock (水题)
    CodeForces 723D Lakes in Berland (dfs搜索)
    CodeForces 723C Polycarp at the Radio (题意题+暴力)
    CodeForces 723B Text Document Analysis (水题模拟)
    CodeForces 723A The New Year: Meeting Friends (水题)
    hdu 1258
    hdu 2266 dfs+1258
  • 原文地址:https://www.cnblogs.com/daybreaking/p/9694910.html
Copyright © 2011-2022 走看看