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

    看楼上楼下题解都大大的短,我就发布个长点的!。。。      
    这道题目其实就是一道模拟的题目,用最最简单的办法就是把s串变为s+s+s,这样子方便首尾连应,然后判断一下当前s[i]和s[j]是否相等,或者s[j]='w'的时候则可以继续下去,这里有个地方需要注意的是:一个被遇到的白色珠子可以被当做红色也可以被当做蓝色。这里强调了是被遇到,也就是说当前面全是w,而现在忽然出现了一个'b','r'都是不行的。也可以说成当当前第i个字符是'w'的时候无需模拟下去(除针对数据——如全是'w')。         
    ============================完美分割线=============================

    #include <iostream>
    #include <cstring>
    using namespace std;
    int main()
    {
        char s[700],c=0;
        int n,i,temp=0,num=0,w=0,ans=0;
        cin>>n>>s;
        memcpy(s+n,s,n);//copy
        for (i=0;i<n*2;i++)
            if (s[i]=='w') num++,w++; //如果是w,把它视为当前颜色,并计数,下面有用
            else if (s[i]==c) num++,w=0;//是当前连续的颜色,计数,w清零
            else //不是的话
            {
                if (temp+num>ans) ans=temp+num;//做一次比较,记录ans
                temp=num-w;num=w+1;w=0;c=s[i];//连续的颜色改变,就开始用temp记录,比如wwwbrwrbww,生成wwwbrwrbwwwwwbrwrbww;
                                               //  一开始是w那么w++;在s【3】时改变temp=0;因为没别的颜色。w就看作b;b=4;
                                               //下一次颜色改变,temp=4,num=1;因为b后没有w这时连续颜色为r有w;以此类推;
                                               //这样子不断重复,其实就是过滤w,只有r,b只要求一个点左边连续的rrrbbbb呀就行在改变点
                                               //断开就可以了;当然会有重复,比如wwwwbbbbrrrr,这是就输出n
                                               //最后的语句就是判断
            }
        if (temp+num>ans) ans=temp+num;//
        cout<<(ans>n?n:ans)<<endl;//
        return 0;
    }



  • 相关阅读:
    GitLab配置SSH密钥
    axios访问本地模拟的json数据
    ODAC Windows 安装
    Linux tar命令
    Oracle INSTR使用
    js map方法的使用
    SessionState的几种设置
    C#整数三种强制类型转换int、Convert.ToInt32()、int.Parse()的区别
    Linux给用户添加sudo权限
    Linux 学习整理
  • 原文地址:https://www.cnblogs.com/Sworddust/p/11427829.html
Copyright © 2011-2022 走看看