第一层第四题:打断项链

Broken Necklace

You have a necklace of N red, white, or blue beads (3<=N<=350) someof which are red, others blue, and others white, arranged at random. Here aretwo examples for n=29:

                12                               1 2

            r b br                           b r r b

          r         b                       b         b

         r           r                     b           r

        r             r                   w             r

       b               r                 w               w

      b                 b               r                 r

      b                 b               b                 b

      b                 b               r                 b

       r               r                 b               r

        b            r                   r             r

         b           r                     r           r

           r       r                         r       b

             r br                             r r w

            FigureA                         Figure B

                       r red bead

                       b blue bead

                       w white bead

The beads considered first and second in the text that follows have beenmarked in the picture.

The configuration in Figure A may be represented as a string of b's andr's, where b represents a blue bead and r represents a red one, as follows:brbrrrbbbrrrrrbrrbbrbbbbrrrrb .

Suppose you are to break the necklace at some point, lay it out straight,and then collect beads of the same color from one end until you reach a bead ofa different color, and do the same for the other end (which might not be of thesame color as the beads collected before this).

Determine the point where the necklace should be broken so that the mostnumber of beads can be collected.

Example

For example, for the necklace in Figure A, 8 beads can be collected, withthe breaking point either between bead 9 and bead 10 or else between bead 24and bead 25.

In some necklaces, white beads had been included as shown in Figure Babove. When collecting beads,a white bead that is encountered may betreated as either red or blue and then painted with the desired color. Thestring that represents this configuration can include any of the three symbolsr, b and w.

Write a program to determine the largest number of beads that can becollected from a supplied necklace.

PROGRAM NAME: beads

INPUT FORMAT

Line 1:

N, the number of beads

Line 2:

a string of N characters, each of which is r, b, or w

SAMPLE INPUT (file beads.in)

29

wwwbbrwrbrbrrbrbrwrwwrbwrwrrb

OUTPUT FORMAT

A single line containing the maximum of number of beadsthat can be collected from the supplied necklace.

SAMPLE OUTPUT (file beads.out)

11

OUTPUT EXPLANATION

Consider two copies of the beads (kind of like being ableto runaround the ends). The string of 11 is marked.

                Twonecklace copies joined here

                             v

wwwbbrwrbrbrrbrbrwrwwrbwrwrrb|wwwbbrwrbrbrrbrbrwrwwrbwrwrrb

                      ******|*****

                       rrrrrb|bbbbb  <-- assignments

                  5xr .....#|#####  6xb

 

                       5+6 = 11 total

 

       题目大意是有一条项链,上面的每个珠子从1到n编号,每个珠子有w(White,白色)、r(Red,红色)、b(Blue,蓝色),你可以从其中某两个珠子间打断这条项链,这样子项链就变成了一条直线(或者说字符串更贴切些),那么我们从这条直线的两端中的一端开始拿珠子,拿走的珠子的颜色必须与这一端最开始的珠子的颜色相同(白色可以被视为任意颜色,若这一端开始的颜色为白色,则认为这一端被取走的珠子的颜色为白色的珠子向内遍历找到的第一颗有颜色的珠子,例如当一条项链被打断并拉直后为wwwrwwbrbbww,则认为从左端取走的珠子的颜色应为红色,则左端最多可以拿走wwwrww共6颗珠子)。那么问题来了:当项链两端都取的时候(珠子不可以重复取),这条项链最多能被取走几条珠子?(例如刚刚举出的例子中,左边最多可以取wwwrww共6颗珠子,右边可以取bbww共4颗珠子,则这条项链可以取走10颗珠子。而当项链拉直后是这种情况时:rrrrrr,这条项链只能被取走6颗珠子)。

       输入分两行,第一行是一个整数n,表示项链的长度,第二行是一个长度为n的字符串,由b,r,w构成,描述项链的颜色。

       (注意:项链的打断方式不一定要按照题目的来,例如:题目输入的字符串为wbrrb,你也可以将它打断为rbwbr,题目要求的本来就是问如何打断项链使能拿到的珠子尽可能多)。

       输出仅一个数字,为项链最多能够被拿走几颗珠子。

       不知道是楼主英语不好还是什么,USACO的题目向来不好看懂,楼主之前的解释也都是七零八落的。。。这题其实一般看懂算法就出来了。枚举从哪里打断项链,再模拟一遍取珠子的的过程,记录下取走的珠子的个数,取其中的最大值即可。

       这里有一个技巧,题目中也有讲,就是将表示项链的字符串复制一遍,接到原字符串后面,为什么呢?请诸位看官继续看。


       这是题目给出的字符串,我们将它复制一遍得到:


       这时当我们从项链的i处打断时(如图),打断后的项链即可表示为从i到i+n-1处的连续一段字符串。此时我们再模拟就简单多了。今后遇上有环形的题目第一个要考虑的就是这个。

       附上代码,供诸位批阅:

/*
ID:su1q2d21
LANG:C++
TASK:beads
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define maxlen 400*2
using namespace std;
char necklace[maxlen];
bool taken[maxlen];
char tmp[maxlen];
int main()
{
	freopen("beads.in","r",stdin);
	freopen("beads.out","w",stdout);
	int n;
	int i,j;
	int ans;
	int op;
	int tans;
	ans=0;
	scanf("%d",&n);
	scanf("%s",necklace);
	strcpy(tmp,necklace);
	strcat(necklace,tmp);
	for(i=0;i<n;i++){
		tans=0;
		memset(taken,0,sizeof(taken));
		op=i;
		while(necklace[op]=='w') op++;
		j=i;
		while(j<i+n){
			if(necklace[j]==necklace[op] || necklace[j]=='w'){
				tans++;
				taken[j]=true;
			}
			else break;
			j++;
		}
		op=i+n-1;
		while(necklace[op]=='w') op--;
		j=i+n-1;
		while(j>=i){
			if((necklace[j]==necklace[op] || necklace[j]=='w') && !taken[j]){
				tans++;
				taken[j]=true;
			}
			else break;
			j--;
		}
		ans=max(ans,tans);
	}
	printf("%d\n",ans);
	return 0;
}

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<vector> #include<map> using namespace std; const int N=2005; const int inf=0x3f3f3f3f; int ans=-1; string a; int f(int x){ int s=0,i; char a1=a[x],b1=a[x+1]; for(i=x;;i--){ if(a[i]==a1||a[i]=='w') s++; else break; } for(i=x+1;;i++){ if(a[i]==b1||a[i]=='w') s++; else break; } return s; } int main() { int n,len,m,i,j,k,x,y; cin>>len>>a; a=a+a+a; for(i=len;i<len*2;i++){ if(a[i]==a[i+1]) continue; if(a[i]=='w'){ a[i]='r'; ans=max(ans,f(i)); a[i]='b'; ans=max(ans,f(i)); a[i]='w'; } ans=max(ans,f(i)); } ans=min(ans,len); if(ans==-1) ans=len; printf("%d",ans); return 0; } P1203 [USACO1.1]坏掉的项链Broken Necklace 目描述 你有一条由 nn 个红色的,白色的,或蓝色的珠子组成的项链,珠子是随意安排的。 这里是 n=29n=29 的两个例子: 第一和第二个珠子在图片中已经被作记号。 图片 A 中的项链可以用下面的字符串表示: brbrrrbbbrrrrrbrrbbrbbbbrrrrb 假如你要在一些点打破项链,展开成一条直线,然后从一端开始收集同颜色的珠子直到你遇到一个不同的颜色珠子,在另一端做同样的事(颜色可能与在这之前收集的不同)。 确定应该在哪里打破项链来收集到最大数目的珠子。 例如,在图片 A 中的项链中,在珠子 99 和珠子 1010 或珠子 2424 和珠子 2525 之间打断项链可以收集到 88 个珠子。 白色珠子什么意思? 在一些项链中还包括白色的珠子(如图片B) 所示。 当收集珠子的时候,一个被遇到的白色珠子可以被当做红色也可以被当做蓝色。 表现含有白珠项链的字符串将会包括三个符号 r,b,w 。 写一个程序来确定从一条被给出的项链可以收集到的珠子最大数目。 输入格式 第一行一个正整数 nn ,表示珠子数目。 第二行一串长度为 nn 的字符串, 每个字符是 r , b 或 w。 输出格式 输出一行一个整数,表示从给出的项链中可以收集到的珠子的最大数量。 输入输出样例 输入 #1复制 29 wwwbbrwrbrbrrbrbrwrwwrbwrwrrb 输出 #1复制 11 说明/提示 【数据范围】 对于 100%100% 的数据,3\le n \le 3503≤n≤350 环的问是把环复制一个或两个成链解决。 ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.youkuaiyun.com/qq_20087731/article/details/104898471解释一下
最新发布
03-21
你有一条项链,它由 N 个随机排列的红、白和蓝色的珠子组成(3<=N<=350)。下面的例子展示了两条 N=29 时的项链: 1 2 1 2 r b b r b r r b r b b b r r b r r r w r b r w w b b r r b b b b b b r b r r b r b r r r b r r r r r r b r b r r r w Figure A Figure B r red bead b blue bead w white bead 项链上的第一个和第二个珠子已经在图中标出了。 图 A 也可以用一个由 b 和 r 组成的字符串直接表示,b 代表蓝色而 r 代表红色,如下所示:brbrrrbbbrrrrrbrrbbrbbbbrrrrb。 假设你想从项链的某处将它截断拉直;接着从一端向另外一端数收集同颜色的珠子,直到碰到一个不同颜色的珠子为止;然后再从另外一端做同样的操作。(一端收集的珠子颜色可以不同于另一端的。) 请想办法找到一个截断项链的位置,能够让我们尽量多地收集到同色的珠子。 例子 如图 A 中的项链,从第 9 和第 10 个或者第 24 和 第 25 个珠子中间截断,则我们可以收集到 8 个珠子。 图 B 中的项链有白色的珠子,当遇到白色的珠子时,它既可以作为蓝色的珠子看待,也可以作为红色的珠子看待,由收集珠子时的需求决定。包含有白色珠子的项链则会由 r、b 和 w 字符组成的字符串来表示。 请编写一个程序计算从某条项链中能够收集到多少个珠子。 输入格式 第一行: N,项链上珠子的个数 第二行:一个字符串,长度为 N,由 r、b 和 w字符组成 输入样例 29 wwwbbrwrbrbrrbrbrwrwwrbwrwrrb 输出格式 输出一行字符,它应该包含了计算出的结果。 输出样例 11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值