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
  • 相关阅读:
    SQL Server数据库损坏、检测以及简单的修复办法
    迭代法
    求两个数组的交集
    jQuery的动画处理总结
    ASP.NET MVC企业开发的基本环境
    ASP.NET WebForm 的路由
    CMStepCounter Class Refernce
    C++输入一个字符串,把其中的字符按照逆序输出的两种方法
    5.2 列出表的列
    Mac Outlook数据文件的位置
  • 原文地址:https://www.cnblogs.com/daybreaking/p/9694910.html
Copyright © 2011-2022 走看看