zoukankan      html  css  js  c++  java
  • 坏掉的项链

    题目描述

    你有一条由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
    两种方法不知为啥 一种错了俩点
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<vector>
    using namespace std;//不考虑白 
    int n,red[800],blue[800],ans;
    char a[800];
    int main()
    {
        scanf("%d
    ",&n);
        char c;
        for(int i=1;i<=n;i++)
        {
            cin>>c;
            a[i]=c;a[i+n]=c;        
        }
        for(int i=1;i<=2*n;i++)
         {
            if(a[i]=='r')
             {
                 red[i]=red[i-1]+1;
             }
            else if(a[i]=='b')
             {
                 blue[i]=blue[i-1]+1;
             } 
            else if(a[i]=='w')
             {
                 blue[i]=blue[i-1]+1;
                 red[i]=red[i-1]+1;
             } 
         }
        
        for(int i=n+n-2;i>=0;i--)
        {
            if(a[i]=='r')
            {
                if(a[i+1]!='b')    red[i]=max(red[i],red[i+1]);
                 if(a[i+1]=='b')    blue[i]=blue[i+1];
            }else
            if(a[i]=='b')
            {
                if(a[i+1]!='r')    blue[i]=max(blue[i],blue[i+1]);
                 if(a[i+1]=='r')    red[i]=red[i+1];
            }else
            {
                red[i]=max(red[i],red[i+1]);
                blue[i]=max(blue[i],blue[i+1]);
            }
            ans=max(red[i]+blue[i+1],ans);
            ans=max(blue[i]+red[i+1],ans);
                
        }
        cout<<ans;
        return 0;
    } 错了俩点
    
    
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<vector>
    using namespace std;
    int n,red[800],blue[800],ans;
    char a[800];
    int main()
    {
        scanf("%d
    ",&n);
        char c;
        for(int i=1;i<=n;i++)
        {
            cin>>c;
            a[i]=c;a[i+n]=c;        
        }
        for(int i=1;i<=n;i++)
        {
            int j=i,tot=0;
            char c=a[i];
            while(a[j]==c||a[j]=='w')
                {
                    if(!j)    j=n;
                    tot++;
                    j--;
                }
            c=a[i+1];
            j=i+1;
            while(a[j]==c||a[j]=='w')
            {
                j++;
                tot++;
            }
            ans=max(tot,ans);
            if(ans>n)
            {
                cout<<n;
                return 0;
            }
        }
        cout<<ans;
        return 0; 
    }
     
  • 相关阅读:
    windows内核函数1
    驱动程序中获取当前进程的进程名的方法
    vs2008+WDK7600驱动开发环境配置
    P2P之UDP穿透NAT的原理与实现之我见
    设计模式-工厂模式
    C++解析ini文件_转载
    利用sort和lambda表达式对vector中的pair进行排序
    C++ 获取目录下具有指定后缀名的所有文件名_windows
    深度学习提取得到的特征值进行特征值相似度比对
    C/C++从路径字符串中获取文件名
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/6554203.html
Copyright © 2011-2022 走看看