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. DNA sequence HDU - 1560

    DNA sequence Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  2. Python基础-两个乒乓球队进行比赛,各出三人。

    两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人.已抽签决定比赛名单.有人向队员打听比赛的名单.a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单. L1 = [ ...

  3. 新建eclipse工作空间的常用设置

    1.设置字体: Window->Preferences->(可以直接搜索font)General -> Appearance ->Colors and Fonts --> ...

  4. NoVNC安装部署

    noVNC 是一个 HTML5 VNC 客户端,采用 HTML 5 WebSockets, Canvas 和 JavaScript 实现,noVNC 被普遍用在各大云计算.虚拟机控制面板中,比如 Op ...

  5. 何为引用法---细谈C++引用

    何为引用...给已有的变量取别名 ; int &a = num;//此处 &不是取地址 而是标明 a是引用变量(a 是 num的别名) 注意: 1.引用必须初始化 2.引用一旦初始化 ...

  6. JAVAEE学习day02

    1.数据类型的转换 1>自动转换(隐式) // 将取值范围小的数据类型自动提升为取值范围大的类型 // 定义byte类型数据 byte b = 10; // 定义short类型数据 short ...

  7. AspNetCore3.1_Secutiry源码解析_2_Authentication_核心对象

    系列文章目录 AspNetCore3.1_Secutiry源码解析_1_目录 AspNetCore3.1_Secutiry源码解析_2_Authentication_核心项目 AspNetCore3. ...

  8. 01.UNIX基础知识

    1.UNIX体系结构 什么叫做内核? 内核是一种软件,它控制计算机硬件资源,并提供程序的运行环境. 什么叫操作系统? 在广义上,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,如可以 ...

  9. vscode灰暗色主题和 左侧加图标 Spacegray VSCode vscode-icons

    vscode灰暗色主题和 左侧加图标 Spacegray VSCode vscode-icons

  10. Journal of Proteome Research | Lipidomics reveals similar changes in serum phospholipid signatures of overweight and obese paediatric subjects (分享人:赵倩倩)

    文献名:Lipidomics reveals similar changes in serum phospholipid signatures of overweight and obese paed ...