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. Eclipse与MyEclipse的联系和区别

    Eclipse与MyEclipse的联系和区别  Eclipse 是一个IDE(Integrated Developing Environment),而这个IDE是允许安装第三方开发的插件来使自身的功 ...

  2. 基于springcloud框架搭建项目-Eureka篇(一)

    springcloud项目近年来算是很流行的了,不少公司项目目前都用到了,毕竟优点很多,刚好公司项目用到了,根据自己的理解,简单搭建一下,以便以后学习 这里简单的介绍一下它: SpringCloud, ...

  3. 第三篇:Linux的基本操作与文件管理(纯命令行模式下)(下)

    接上篇介绍完软件的管理(查询.删除.安装)之后,本篇将介绍Linux的文件和目录的管理. 如何浏览Linux的目录(文件夹),就像Windows一样,我们平时需要打开各个目录,去里面找一找曾经悄悄存储 ...

  4. 网络工程师和Linux运维工程师有什么区别?学哪个比较好?

    网络工程师和Linux运维工程师有什么区别?学哪个比较好? 机缘巧合下,我进入了一家从事vpn与系统集成的公司,很感谢公司能留下我这个非网络工程专业的毕业生,从对网络一窍不通,慢慢可以自己独立完成工作 ...

  5. rabitmq + php

    消费者 <?php //配置信息 $conn_args = array( 'host' => '127.0.0.1', 'port' => '5672', 'login' => ...

  6. SIP压力测试——奇林软件kylinPET

    一.Sip协议简介: SIP(Session Initiation Protocol,会话初始协议)是由IETF(Internet Engineering Task Force,因特网工程任务组)制定 ...

  7. 【WPF学习】第五十九章 理解控件模板

    最近工作比较忙,未能及时更新内容,敬请了解!!! 对于可视化树的分析引出了几个有趣问题.例如,控件如何从逻辑树表示扩张成可视化树表示? 每个控件都有一个内置的方法,用于确定如何渲染控件(作为一组更基础 ...

  8. mysql的那些事之架构

    MySQL架构的那些事 此篇博客为原创,欢迎转载,转载时请注明出处,谢谢 最近深入学习了一下mysql的内容,想把自己的理解分享出来. mysql架构 逻辑架构 Connectors:连接器 Mana ...

  9. python之 filter

    filter的语法:filter(函数名字,可迭代的变量) 其实filter就是一个“过滤器”:把[可迭代的变量]中的值,挨个地传给函数进行处理,那些使得函数的返回值为True的变量组成的迭代器对象就 ...

  10. (转)springBoot 配置信息一览

    原文链接:https://cloud.tencent.com/developer/article/1360699