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

题目描述

你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的。 这里是 n=29 的二个例子:



第一和第二个珠子在图片中已经被作记号。

图片 A 中的项链可以用下面的字符串表示:

brbrrrbbbrrrrrbrrbbrbbbbrrrrb

假如你要在一些点打破项链,展开成一条直线,然后从一端开始收集同颜色的珠子直到你遇到一个不同的颜色珠子,在另一端做同样的事(颜色可能与在这之前收集的不同)。

确定应该在哪里打破项链来收集到最大数目的珠子。

例如,在图片 A 中的项链中,在珠子 9 和珠子 10 或珠子 24 和珠子 25 之间打断项链可以收集到8个珠子。

白色珠子什么意思?

在一些项链中还包括白色的珠子(如图片B) 所示。

当收集珠子的时候,一个被遇到的白色珠子可以被当做红色也可以被当做蓝色。

表现含有白珠项链的字符串将会包括三个符号 r , b 和 w 。

写一个程序来确定从一条被给出的项链可以收集到的珠子最大数目。

输入输出格式 d 输入格式: 第 1 行: N, 珠子的数目

第 2 行: 一串长度为N的字符串, 每个字符是 r , b 或 w。

输出格式: 输入输出样例

输入样例#1:

29
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb
输出样例#1:
11

题目思路

这一题可以用dp去写,但是我只能想到用暴力枚举(由于数据范围比较小)在每一个位置断开所能得到的珠子的最大数量,具体思路直接看代码吧

题解如下

#include<iostream>
using namespace std;
const int Len = 355; struct Bead
{
int cnt;
char color;
}bead[Len]; int main()
{
// freopen("T.txt","r",stdin);
int pos = 0;
int n;
scanf("%d", &n); char ch;
int cnt = 0;
int last_ch = '@'; //对上一个初始化成一个特殊字符
for(int i = 0; i < n; i ++) //统计连续相同颜色珠子的数量及颜色
{
cin>>ch;
if(ch != last_ch)
{
bead[pos].cnt = cnt;
bead[pos].color = last_ch;
pos ++;
cnt = 0;
last_ch = ch;
}
cnt ++;
}
//对字符串最后一个连续相同的字符数量进行统计
bead[0].color = bead[1].color;
bead[pos].cnt = cnt;
bead[pos ++].color = last_ch; int ans = 0,len = 0; //len 当前正在讨论从某个位置断开可以得到的最大珠子的数量 for(int i = 2; i < pos; i ++) //遍历每一个位置进行讨论
{
if(bead[i].color == 'w')
continue; int l_i = i - 2,r_i = i + 1; //l_i 从i - 2这个位置从右向左遍历,r_i从i+1 这个位置从左向右一个一个的判读
r_i %= pos; //防止下标越界 len = bead[i - 1].cnt + bead[i].cnt;
int flag_w = 0; //是否i - 1 这个位置的珠子是白色的
if(bead[i - 1].color == 'w') //如果是
{
flag_w = 1;
bead[i - 1].color = bead[l_i].color; //把i-1这些白颜色的珠子变成 i - 2 位置的珠子的颜色
}
char l_co = bead[i - 1].color,r_co = bead[i].color; //l_co 挨着断开出左边珠子的颜色,r_co挨着断开出右边珠子的颜色
//右边的长度判断
while(true)
{
if(bead[r_i].color == r_co || bead[r_i].color == 'w')
{
len += bead[r_i].cnt;
r_i ++;
r_i %= pos;
}
else
{
break;
}
if(r_i == l_i) //在讨论右边长度的时候如果r_i == l_i 时候是没有讨论这个位置所代表的珠子颜色是否 l_co 或 r_co 颜色相同,这将在讨论 左边长度 的时候进行讨论
{
break;
}
}
//左边长度的判读
while(true)
{
if(bead[l_i].color == l_co || bead[l_i].color == 'w')
{
len += bead[l_i].cnt;
l_i --;
if(l_i < 0)
l_i = pos - 1;
}
else
{
break;
} if(l_i == r_i) //特判了
{
if(bead[l_i].color == 'w' || bead[l_i].color == l_co || bead[l_i].color == r_co)
{
len += bead[l_i].cnt;
}
break;
}
} if(flag_w) //如果i - 1 位置的颜色是白色,用完之后要把这个i - 1 位置所代表的珠子颜色变回来
{
bead[i - 1].color = 'w';
} ans = max(ans , len);
}
if(ans == 0) //特殊情况讨论,如果所给珠子串全是 ‘w’
{
ans = n;
}
printf("%d",ans); return 0;
}

P1203 [USACO1.1]Broken Necklace(模拟-枚举)的更多相关文章

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

    P1203 [USACO1.1]坏掉的项链Broken Necklace不错的断环为链的模拟题,开成三倍,有很多细节要考虑,比如总长度要<=n,开头第一个是w等等. #include<bi ...

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

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

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

    [USACO1.1]坏掉的项链Broken Necklace 22892 破碎的项链 方法一:很容易想到枚举断点,再分别两头找,但是要注意很多细节 #include<iostream> # ...

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

    坏掉的项链Broken Necklace 难度:★ Code: #include <iostream> #include <cstdio> #include <cstri ...

  5. [USACO1.1.4]坏掉的项链Broken Necklace

    P1203 [USACO1.1]坏掉的项链Broken Necklace 标签 搜索/枚举 USACO 难度 普及- 题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N&l ...

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

    题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...

  7. AC日记——[USACO1.1]坏掉的项链Broken Necklace 洛谷 P1203

    题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...

  8. [LuoguP1203][USACO1.1]P1203 Broken Necklace

    Solution 这道题数据规模奇小,因此大部分人都使用了暴力搜索的方法,这也是我一开始的想法. 对于 100100%100 的数据,3≤n≤3503≤n≤3503≤n≤350 的确可以如此,但暴力搜 ...

  9. 【USACO1.1】Broken Necklace

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

随机推荐

  1. python爬虫的数据库连接问题

    1.需要导的包 import pymysql 2.# mysql连接信息(字典形式) db_config ={ 'host': '127.0.0.1',#连接的主机id(107.0.0.1是本机id) ...

  2. Block详解一(底层分析)

    本篇博客不再讲述Block的基本定义使用,最近而是看了很多的block博客讲述的太乱太杂,所以抽出时间整理下block的相关底层知识,在讲述之前,提出几个问题,如果都可以回答出来以及知道原理,大神绕过 ...

  3. 2019.3.14解题报告&补题报告

    A题 题意: 输入r, c,代表r*c的矩阵,接下来一行,是r个数,代表每一行里最大的数:接下来一行,是c个数,代表每一列中的最大数.求所给数据是否冲突. 思路:判断r个数中最大数maxr和c个数中最 ...

  4. zookeeper基础学习-简介

    1.zookeeper的使命 zookeeper可以在分布式系统的协作多个任务(一个任务是指一个包含多个进程的任务),这个任务可以是为了协作或者是为了管理竞争. 协作:多个进程需要一同处理某些事情,一 ...

  5. gdb中的gef插件

    地址 https://github.com/hugsy/gef # via the install script #下载 `gef.sh` 并执行 wget -q -O- https://github ...

  6. EFCore DbContext 报SqlException: Incorrect syntax near 'OFFSET'.

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSq ...

  7. 由最多N个给定数字集组成的数字 Numbers At Most N Given Digit Set

    2019-10-14 22:21:29 问题描述: 问题求解: 暴力求解必然会超时,那么就需要考虑数学的方法来降低时间复杂度了. public int atMostNGivenDigitSet(Str ...

  8. 浅谈VUE,使用watch方法监听父组件传到子组件的数据。

    props:['updateData'], data(){ return{ form: { _name:'', }, } }, 第一步接收数据: props:['updateData']   第二步动 ...

  9. python ndarray与pandas series相互转换,ndarray与dataframe相互转换

    https://blog.csdn.net/qq_33873431/article/details/98077676

  10. C#中的9个“黑魔法”与“骚操作”

    C#中的9个"黑魔法"与"骚操作" 我们知道C#是非常先进的语言,因为是它很有远见的"语法糖".这些"语法糖"有时过于好 ...