【USACO】1.1.4 Broken Necklace 破碎的项链

创作灵感:整理自己的解题思路

1.1.4 Broken Necklace 破碎的项链

你有一条由N个红色、白色或蓝色珠子随机排列组成的项链(3<=N<=350),下面给出n=29的两个示例:

image.png

被认为是1号和2号的珠子在图中已经被给出。

如图A中,brw分别代表蓝色、红色、白色三种珠子,它可以被表示为:brbrrrbbbrrrrrbrrbbrbbbbrrrrb。

假设你要在某个时候折断项链,把它摆直,然后从一端收集相同颜色的珠子,直到你找到一个不同颜色的珠子,对另一端做同样的事情(当然这端收集到的珠子和之前收集的珠子颜色可能不相同)。

你要确定在哪里折断项链以获得最多的珠子。

举例:

对于图A的项链,可以收集最多8颗珠子,在珠子9和珠子10之间断裂,或者在珠子24和珠子25之间断裂。

对于图 B的项链,有一些项链中包含了白色珠子。收集珠子时,遇到的白色珠子可能会被认为是红色或蓝色。

编写一个程序来确定可以从提供的项链中收集的珠子的最大数量。

输入格式:

第1行:N,珠子的数量;

第2行:一个长度为N的字符串包括brw三个字母;

输出格式:

一行一个整数表示最大能收集到的珠子数。

样例1输入:

29 wwwbbrwrbrbrrbrbrwrwwrbwrwrrb

样例1输出:

11

储存:用一个字符数组储存整个项链。
算法的基本思路:断点枚举;
初始化:将数组往后复制一份形成一个2*n长度的数组
算法分析;
先往左边枚举,如果遇到的是白球或者是与上一个颜色相同的球(通过位运算来保证)则继续向右
左边同理
最后将枚举的结果与ans比较,ans被赋为这两个中的最大值。

#include <iostream>
using namespace std;
char s[710];//存放项链
int n=0;//项链长度
int dtmcol(char c)//判断颜色
{
	if(c=='b') return 1;
	else return 2; 
 } 
int main() {
	int ans=0;
	cin>>n>>s;//输入项链长度和项链
	for(int i=0;i<n;i++) s[i+n]=s[i];//将项链变为2*n长度来处理环
	for(int i=0;i<n;i++)
	{
		int l=i,r=i+n-1;
		int cnt=0,left=0,right=0;//cnt==count
		while(l<=r&& (s[l]=='w'||(left|dtmcol(s[l]))!=3))//向左枚举
		{
			if(s[l]!='w') left|=dtmcol(s[l]);
			cnt++,l++;
		}
		while(l<=r&& (s[r]=='w'||(right|dtmcol(s[r]))!=3))//向右枚举
		{
			if(s[l]!='w') right|=dtmcol(s[r]);
			cnt++,r--;
		}
		ans=ans>cnt?ans:cnt;//比较大小
	} 
	cout<<ans;//输出答案
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值