题意

一个环形项链,有rbw三种珠子,r代表red,b代表blue,w代表white,从任意一个位置断开,两端分别取珠子,同一端取的珠子要相同颜色,w可以染成想要的颜色,即既可当作r也可以当作b,求最多取得的珠子个数。最多有350个珠子。

分析

可以枚举断开的位置,然后模拟取珠子。也可以枚举起点位置。还可以dp做。

代码

枚举断点

  1. #include<cstdio>
    #include<algorithm>
    #define N 355
    using namespace std;
  2. char a;
    int b[N];
    int n,ans;
  3. int solve(int p,int dir) //p为起始点,dir为方向,求最多取几颗
    {
    int len=0;//取了的珠子个数,最多取n颗珠子
  4. for(int j=p+n; len<n; len++,j+=dir) //j为当前位置+n,当前位置为j%n
    {
    if(b[p] && b[j%n] && b[j%n]!=b[p])
    break;
    if(!b[p])//每次取珠子都要符合p位置的颜色,若p位置是w,就要更新p
    p=j%n;
    }
    return len;
    }
    int main()
    {
    scanf("%d ",&n);
    for(int i=0; i<n; i++)
    {
    a=getchar();
    b[i]=a=='b'?1:a=='r'?2:0;// b--1 r--2 w--0
    }
    for(int i=0; i<n; i++)//枚举断点
    ans=max(ans,solve(i,-1)+solve(i+1,1));
    ans=min(ans,n);//可能同一颗被两次计算过,但只出现在全都取的情况里
    printf("%d\n",ans);
    return 0;
    }

枚举起点

  1. #include<cstdio>
    #include<algorithm>
    #include<iostream>
    #include<string>
    using namespace std;
    int n,ans;
    string s;
    int main()
    {
    cin>>n>>s;
    s+=s;
    for(int i=0,j; i<n; i++) //以i为第一段的起点,不是切开的位置
    {
    char now=s[i];
    int len=0;
    int times=now=='w'?3:2;//如果当前是白色,那么需要找三段相同颜色的否则找两段
    j=i;
    while(times--)
    {
    while(j<i+n&&(s[j]==now||s[j]=='w'))
    {
    len++;
    j++;
    }
    now=s[j];
    }
    ans=max(ans,len);
    }
    cout<<ans<<endl;
    return 0;
    }

DP

  1. #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<string>
    #define N 720
    using namespace std;
    int n,ans;
    string s;
    int l[N][2],r[N][2];
    int main(){
    cin>>n>>s;
    s+=s;
    for(int i=1;i<2*n;i++){
    l[i][0]=l[i-1][0]+1;
    l[i][1]=l[i-1][1]+1;
    if(s[i-1]=='r')
    l[i][1]=0;
    else if(s[i-1]=='b')
    l[i][0]=0;
    }
    for(int i=2*n-1;i>=0;i--){
    r[i][0]=r[i+1][0]+1;
    r[i][1]=r[i+1][1]+1;
    if(s[i]=='r')
    r[i][1]=0;
    else if(s[i]=='b')
    r[i][0]=0;
    }
    for(int i=0;i<2*n;i++)
    ans=max(ans,max(l[i][0],l[i][1])+max(r[i][0],r[i][1]));
    ans=min(ans,n);
    cout<<ans<<endl;
    return 0;
    }
 
 

【USACO1.1】Broken Necklace的更多相关文章

  1. 【P1203】 【USACO1.1】坏掉的项链Broken Necklace

    P1203 [USACO1.1]坏掉的项链Broken Necklace 题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 ...

  2. 【codeforces 797D】Broken BST

    [题目链接]:http://codeforces.com/contest/797/problem/D [题意] 给你一个二叉树; 然后问你,对于二叉树中每个节点的权值; 如果尝试用BST的方法去找; ...

  3. 【26.34%】【codeforces 722A】Broken Clock

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  4. 【洛谷 P1216】【IOI1994】【USACO1.5】数字三角形 Number Triangles

    (如此多的标签qaq) 数字三角形 Number Triangles[传送门] 本来打算当DP练的,没想到写着写着成递推了(汗) 好的没有时间了,我们附个ac代码(改天不写): #include< ...

  5. 【洛谷P1207】双重回文数 【USACO1.2】

    P1207 [USACO1.2]双重回文数 Dual Palindromes 题目描述 如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做"回文数".例如,12321就是一 ...

  6. 【洛谷P1204】【USACO1.2】挤牛奶Milking Cows

    P1204 [USACO1.2]挤牛奶Milking Cows 题目描述 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶.第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒.第二个 ...

  7. 【USACO1.2_2】★Transformations 方块转换

    一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案.写一个程序来找出将原始图案依照下面列转换方法转换成新图案的最小方式: 1:转90度:图案按顺时针转90度. ...

  8. 【HDU 5730】Shell Necklace

    http://acm.hdu.edu.cn/showproblem.php?pid=5730 分治FFT模板. DP:\(f(i)=\sum\limits_{j=0}^{i-1}f(j)\times ...

  9. 【数论】【Polya定理】poj1286 Necklace of Beads

    Polya定理:设G={π1,π2,π3........πn}是X={a1,a2,a3.......an}上一个置换群,用m中颜色对X中的元素进行涂色,那么不同的涂色方案数为:1/|G|*(mC(π1 ...

随机推荐

  1. jquery/js实现验证聚焦,失焦

    jquery实现验证聚焦,失焦方法: 我还是喜欢用jquery来实现,不管页面中多少个输入框需要实现聚焦,失焦,都公有,我常用的方法是: 遍历该页面中的input框,获取输入框中的val值,当该输入框 ...

  2. DOTween文档

    前言 DOTween现在还处于 alpha,所以还有一些缺失的功能(如路径插件,附加回调和其它的tween选项),这个文档在不久的将来可能会更新. DoTween:0.8.2.00 官方文档:http ...

  3. css3实现立方体的旋转功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. jq 操作table

    转载于:http://www.jb51.net/article/34633.htm jquery获取table中的某行全部td的内容方法,需要的朋友可以参考一下   <table>< ...

  5. js的nextSibling,属性兼容IE和FF等浏览器

    Firefox中 空白字符,比如回车,空格等也算作一个Node 就是firstChild,nextsbiling这两个.下面给出函数吧.还是代码比较说明问题代码都是网上来的.不过要注意的是,getNe ...

  6. HYSBZ 2145 悄悄话

    2145: 悄悄话 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 271  Solved: 104[Submit][Status][Discuss] ...

  7. C# LUA 闭包

    许多语言中有闭包的概念,C#的闭包以lambda表达式表现,可以实现与LUA完全一样的效果. //LUA------------------------------------------------ ...

  8. 将Html文档整理为规范XML文档

    有多种方式可以在.NET 平台进行HTML文件解析.数据提取,其中最简单.稳妥的办法是先使用工具将Html文档整理成XML文档,再通过XML Dom模型或XPath灵活地进行数据处理.SGML便是一个 ...

  9. Java集合---Arrays类源码解析

    一.Arrays.sort()数组排序 Java Arrays中提供了对所有类型的排序.其中主要分为Primitive(8种基本类型)和Object两大类. 基本类型:采用调优的快速排序: 对象类型: ...

  10. js字符串截取函数slice()、substring()、substr()

    摘要 在js中字符截取函数有常用的三个slice().substring().substr()了,下面我来给大家介绍slice().substring().substr()函数在字符截取时的一些用法与 ...