【USACO1.1】Broken Necklace
题意
一个环形项链,有rbw三种珠子,r代表red,b代表blue,w代表white,从任意一个位置断开,两端分别取珠子,同一端取的珠子要相同颜色,w可以染成想要的颜色,即既可当作r也可以当作b,求最多取得的珠子个数。最多有350个珠子。
分析
可以枚举断开的位置,然后模拟取珠子。也可以枚举起点位置。还可以dp做。
代码
枚举断点
#include<cstdio>
#include<algorithm>
#define N 355
using namespace std;
char a;
int b[N];
int n,ans;
int solve(int p,int dir) //p为起始点,dir为方向,求最多取几颗
{
int len=0;//取了的珠子个数,最多取n颗珠子
for(int j=p+n; len<n; len++,j+=dir) //j为当前位置+n,当前位置为j%n
{
if(b[p] && b[j%n] && b[j%n]!=b[p])
break;
if(!b[p])//每次取珠子都要符合p位置的颜色,若p位置是w,就要更新p
p=j%n;
}
return len;
}
int main()
{
scanf("%d ",&n);
for(int i=0; i<n; i++)
{
a=getchar();
b[i]=a=='b'?1:a=='r'?2:0;// b--1 r--2 w--0
}
for(int i=0; i<n; i++)//枚举断点
ans=max(ans,solve(i,-1)+solve(i+1,1));
ans=min(ans,n);//可能同一颗被两次计算过,但只出现在全都取的情况里
printf("%d\n",ans);
return 0;
}
枚举起点
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<string>
using namespace std;
int n,ans;
string s;
int main()
{
cin>>n>>s;
s+=s;
for(int i=0,j; i<n; i++) //以i为第一段的起点,不是切开的位置
{
char now=s[i];
int len=0;
int times=now=='w'?3:2;//如果当前是白色,那么需要找三段相同颜色的否则找两段
j=i;
while(times--)
{
while(j<i+n&&(s[j]==now||s[j]=='w'))
{
len++;
j++;
}
now=s[j];
}
ans=max(ans,len);
}
cout<<ans<<endl;
return 0;
}
DP
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#define N 720
using namespace std;
int n,ans;
string s;
int l[N][2],r[N][2];
int main(){
cin>>n>>s;
s+=s;
for(int i=1;i<2*n;i++){
l[i][0]=l[i-1][0]+1;
l[i][1]=l[i-1][1]+1;
if(s[i-1]=='r')
l[i][1]=0;
else if(s[i-1]=='b')
l[i][0]=0;
}
for(int i=2*n-1;i>=0;i--){
r[i][0]=r[i+1][0]+1;
r[i][1]=r[i+1][1]+1;
if(s[i]=='r')
r[i][1]=0;
else if(s[i]=='b')
r[i][0]=0;
}
for(int i=0;i<2*n;i++)
ans=max(ans,max(l[i][0],l[i][1])+max(r[i][0],r[i][1]));
ans=min(ans,n);
cout<<ans<<endl;
return 0;
}
【USACO1.1】Broken Necklace的更多相关文章
- 【P1203】 【USACO1.1】坏掉的项链Broken Necklace
P1203 [USACO1.1]坏掉的项链Broken Necklace 题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 ...
- 【codeforces 797D】Broken BST
[题目链接]:http://codeforces.com/contest/797/problem/D [题意] 给你一个二叉树; 然后问你,对于二叉树中每个节点的权值; 如果尝试用BST的方法去找; ...
- 【26.34%】【codeforces 722A】Broken Clock
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【洛谷 P1216】【IOI1994】【USACO1.5】数字三角形 Number Triangles
(如此多的标签qaq) 数字三角形 Number Triangles[传送门] 本来打算当DP练的,没想到写着写着成递推了(汗) 好的没有时间了,我们附个ac代码(改天不写): #include< ...
- 【洛谷P1207】双重回文数 【USACO1.2】
P1207 [USACO1.2]双重回文数 Dual Palindromes 题目描述 如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做"回文数".例如,12321就是一 ...
- 【洛谷P1204】【USACO1.2】挤牛奶Milking Cows
P1204 [USACO1.2]挤牛奶Milking Cows 题目描述 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶.第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒.第二个 ...
- 【USACO1.2_2】★Transformations 方块转换
一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案.写一个程序来找出将原始图案依照下面列转换方法转换成新图案的最小方式: 1:转90度:图案按顺时针转90度. ...
- 【HDU 5730】Shell Necklace
http://acm.hdu.edu.cn/showproblem.php?pid=5730 分治FFT模板. DP:\(f(i)=\sum\limits_{j=0}^{i-1}f(j)\times ...
- 【数论】【Polya定理】poj1286 Necklace of Beads
Polya定理:设G={π1,π2,π3........πn}是X={a1,a2,a3.......an}上一个置换群,用m中颜色对X中的元素进行涂色,那么不同的涂色方案数为:1/|G|*(mC(π1 ...
随机推荐
- html5实现微信摇一摇功能
在HTML5中,DeviceOrientation特性所提供的DeviceMotion事件封装了设备的运动传感器时间,通过改时间可以获取设备的运动状态.加速度等数据(另还有deviceOrientat ...
- CSS强制性换行word-break与word-wrap的使用
一般情况下,元素拥有默认的white-space:normal(自动换行,不换行是white-space:nowrap),当录入的文字超过定义的宽度后会自动换行,但当录入的数据是一堆没有空格的字符或字 ...
- Eclipse中的快捷键总结
Eclipse中10个最有用的快捷键组合 一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合.通过这些组合可以更加容易的浏览源代码,使得整体的开发效率和质量得到提升. ...
- 在A*寻路中使用二叉堆
接上篇:A*寻路初探 GameDev.net 在A*寻路中使用二叉堆 作者:Patrick Lester(2003年4月11日更新) 译者:Panic 2005年3月28日 译者序 这一篇文章,是&q ...
- as3 Point
首先我们看看Point类的属性:x:Number——该点的水平坐标y:Number——该点的垂直坐标length:Number——从(0,0)到此点的线段长度(只读属性)从length属性我们可以看到 ...
- xshell5 启动显示 mfc110.dll msvcp110.dll 未找到问题 解决办法
1. 安装 Visual C++ Redistributable for Visual Studio 2012 x86版本 注意: 一定要安装x86版本.(xshell5是32位的程序) 微软的官方下 ...
- C#中的Decimal类型
这种类型又称财务类型,起源于有效数字问题.FLOAT 单精度,有效数字7位.有效数字是整数部分和小数部分加起来一共多少位.当使用科学计数法的,FLOAT型会出现很严重的错误.比如 8773234578 ...
- git流程及操作
一.git认识 git是什么?Git是目前世界上最先进的分布式版本控制系统 二.git安装 三.git创建本地库 1.首先选择e盘新建一个文件夹如douban 2.点击鼠标右键,执行Git Bash ...
- jQuery Event.stopPropagation() 函数详解
stopPropagation()函数用于阻止当前事件在DOM树上冒泡. 根据DOM事件流机制,在元素上触发的大多数事件都会冒泡传递到该元素的所有祖辈元素上,如果这些祖辈元素上也绑定了相应的事件处理函 ...
- Log4Net写入到数据库配置过程中的一些小问题备忘
问题1: 在公司进行log4net写入服务器配置的时候,一切正常,但是在家里的机器上,就频繁出现这个问题: SQL Server 2008 报错:已成功与服务器建立连接,但是在登录前的握手期间发生错误 ...