USACO 1.1 Broken Necklace(USACO官方)

本题我不会写,囧,看了官方的代码,算法复杂度为O(n^2),学习下:

/*
  ID:twd30651
  PROG:beads
  LANG:C++
*/
#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;
int N;
char s[400];
int len;
int mod(int n,int m)
{
    while(n<0)n+=m;
    return n%m;//值得学习,跑一圈又回来
}
int nbreak(int p,int dir)
{
    int i;
    int n;
    if(dir>0)
        i=p;
    else
        i=mod(p-1,len);
    char color='w';//用color来保存颜色
    for(n=0;n<len;i=mod(i+dir,len))
    {
        if(color=='w'&&s[i]!='w')
            color=s[i];//处理收集珠子时颜色的变换
        else if(color!=s[i]&&s[i]!='w')
            break;
        n++;
    }
    return n;
}
int main(int argc,char *argv[])
{
    freopen("beads.in","r",stdin);
    freopen("beads.out","w",stdout);
    int i=0;
    scanf("%d",&N);
    scanf("%s",s);
    len=strlen(s);
    int n;
    int m=0;
    for(i=0;i<len;++i)
    {
        n=nbreak(i , 1)+nbreak(i,-1);//兵分两路
        if(n>m)
            m=n;
    }
    if(m>len)//考虑转了一圈,又回来了,类似于"rrrrrr"这样的字符串
        m=len;
    printf("%d\n",m);
    return 0;
}

下面一种方法是dp,时间复杂度为O(n)

/*
  ID:twd30651
  PROG:beads
  LANG:C++
*/
#include<iostream>
#include<fstream>
#include<stdlib.h>
#include<string.h>
using namespace std;
/*
  copy:
  用数组bl,br,rl,rr分别记录在项链i处向左向右收集的蓝色红色珠子数。
  项链是环形的,但我们只要把两个同样的项链放在一块,就把它转换成线性的了。
  我们只要求出bl,br,rl,rr,那么结果就是max(max(bl[i],rl[i])+max(br[i+1],rr[i+1])) (0<=i<=2*n-1)。
  我们以求bl,rl为例:
  初始时bl[0]=rl[0]=0
  我们从左往右计算
  如果necklace[i]='r',rl[i]=rl[i-1]+1,bl[i]=0;
  如果necklace[i]='b', bl[i]=bl[i-1]+1,rl[i]=0;
  如果necklace[i]='w',bl[i]=bl[i-1]+1,rl[i]=rl[i-1]+1。
  同理可以求出br,rr。
*/
typedef struct node
{
    int lr;//向左最多红色珠子
    int lb;//向左最多蓝色珠子
    int rr;//向右最多红色珠子
    int rb;//向右最多蓝色珠子
}node;
node necklace[800];
char s[800];
char tmp[400];
int N;
int main(int argc,char *argv[])
{
    freopen("beads.in","r",stdin);
    freopen("beads.out","w",stdout);
    int i=0;
    scanf("%d",&N);
    scanf("%s",s);
    strcpy(tmp, s);
    //也是珠子加上它自己的一个副本
    strcat(s, tmp);
    necklace[0].lr=0;
    necklace[0].lb=0;
    for(int i=1;i<=2*N;++i)
    {
        if(s[i-1]=='r')
            necklace[i].lr=necklace[i-1].lr+1,necklace[i].lb=0;
        else if(s[i-1]=='b')
            necklace[i].lb=necklace[i-1].lb+1,necklace[i].lr=0;
        else
            necklace[i].lb=necklace[i-1].lb+1,
                necklace[i].lr=necklace[i-1].lr+1;
    }
    necklace[2*N].rr=0;
    necklace[2*N].rb=0;
    for(int i=2*N-1;i>=0;--i)
    {
        if(s[i]=='r')
            necklace[i].rr=necklace[i+1].rr+1,necklace[i].rb=0;
        else if(s[i]=='b')
            necklace[i].rb=necklace[i+1].rb+1,necklace[i].rr=0;
        else
            necklace[i].rb=necklace[i+1].rb+1,
                necklace[i].rr=necklace[i+1].rr+1;
    }
    int m=0;
    for(int i=0;i<2*N;++i)
        m=max(m,max(necklace[i].lr,necklace[i].lb)
              +
              max(necklace[i].rr, necklace[i].rb));
    if(m>N)
        m=N;
    printf("%d\n",m);
    return 0;
}
时间: 2024-10-20 12:02:12

USACO 1.1 Broken Necklace(USACO官方)的相关文章

USACO 1.1 Broken Necklace

Broken Necklace You have a necklace of N red, white, or blue beads (3<=N<=350) some of which are red, others blue, and others white, arranged at random. Here are two examples for 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

USACO section1.1 Broken Necklace

1 /* 2 ID: vincent63 3 LANG: C 4 TASK: beads 5 */ 6 #include <stdio.h> 7 #include<stdlib.h> 8 #include<string.h> 9 int findmax(char s[],int n){ 10 int i,j,count,max,l,r; 11 char left,right; 12 max=0; 13 count=0; 14 int p; 15 for(i=0,j=1;

USACO Section1.1PROB Broken Necklace

有点麻烦的一道模拟(官方题解好像有复杂度为$O(n)$DP的姿势?,感觉好烦,以后再细看~ 在一些细节上调试了很久很久,囧RZ /* ID: jusonal1 PROG: beads LANG: C++ */ #include <iostream> #include <fstream> #include <string> #include <cstdio> #include <algorithm> #include <map> #in

USACO Section1.1 Broken Necklace 解题报告

beads解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------------------------------------------------------------------------------------------[题目] 输入文件:第一行N:第二行一个字符串A,长度为N.字符串中,仅有r.w.b三种字符,分别代表红.白.蓝. A代表一串项链,有三种颜

洛谷 P1203 [USACO1.1]坏掉的项链Broken Necklace

P1203 [USACO1.1]坏掉的项链Broken Necklace 题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A 中的项链可以用下面的字符串表示: brbrrrbbbrrrrrbrrbbrbbbbrrrrb 假如你要在一些点打破项链,展开成一条直线,然后从一端开始收集同颜色的珠子直到你遇到一个不同的颜色珠子,在另一端做同样的事(颜色可能与在这之前收

P1203 [USACO1.1]坏掉的项链Broken Necklace

P1203 [USACO1.1]坏掉的项链Broken Necklace 题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A 中的项链可以用下面的字符串表示: brbrrrbbbrrrrrbrrbbrbbbbrrrrb 假如你要在一些点打破项链,展开成一条直线,然后从一端开始收集同颜色的珠子直到你遇到一个不同的颜色珠子,在另一端做同样的事(颜色可能与在这之前收

Section1.1 -- Broken Necklace

Broken Necklace You have a necklace of N red, white, or blue beads (3<=N<=350) some of which are red, others blue, and others white, arranged at random. Here are two examples for 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

题解 P1203 【[USACO1.1]坏掉的项链Broken Necklace】

[USACO1.1]坏掉的项链Broken Necklace 22892 破碎的项链 方法一:很容易想到枚举断点,再分别两头找,但是要注意很多细节 #include<iostream> #include<string> #include<cstdio> using namespace std; string s; int n,l,r,ll,rr,tmp,ans; inline int calc(int x) { ll=s[x],rr=s[x+1],l=x-1,r=x+2

Broken Necklace 坏掉的项链 USACO 模拟(易错)

1004: 1.1.4Broken Necklace 坏掉的项链 时间限制: 1 Sec  内存限制: 128 MB提交: 11  解决: 9[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 1.1.4Broken Necklace 坏掉的项链 (beads.pas/c/cpp) 题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 1 2 1 2 r b b r b r r b r b b b