现在的位置: 首页 > 综合 > 正文

USACO 1.1 Problem 4

2017年11月21日 ⁄ 综合 ⁄ 共 964字 ⁄ 字号 评论关闭

题目描述:

嗯这道题的题目照样很好懂。作为section 1.1的守关题,硬要说的话其实比之前确实是要复杂了。好吧,大意就是input一个string,包含了rbw三种character,把他们看成是珍珠,把string看成是项链,然后在项链上打掉一个点,左右方向同时开始收集同一颜色的连续的珠子,看最多有几个。然后红(r),蓝(b)都是正常的,白(w)就是为了增加难度,变成了可看成蓝的可看成白的。

算法思想:

这道题的简单之处就在于只要你从头开始枚举一遍,根本就不用考虑w该选择是红色还是蓝色。

根本不用考虑!!!卧槽简单死我了。

算法的话唯一值得说的就是把string翻一倍接在后面。然后从1一直循环到2n的地方,然后再每一个循环内部开两个循环来检测左右各能收集到多少个。

并且值得注意的是这样的算法有可能超过n,超过n就说明是存在一个break方式让左右收集之后就收集到了所有的珠子,嗯这时候就output n出来就好了。

代码部分:

#include <fstream>
#include <iostream>
using namespace std;

char ca[717];

int main() {
	ifstream fin("beads.in");
	ofstream fout("beads.out");
	int n;
	fin >> n;
	for (int i = 1; i <= n; i++) {
		char c;
		fin >> c;
		ca[i] = c; ca[i + n] = c;
	}

	int res = 0;
	for (int i = 1; i <= 2*n; ++i) {
		int a=0,b=0;
		char c1 = ca[i];
		char c2 = ca[i - 1];
		for (int k1 = i; k1 <= 2*n; k1++) {
			if (ca[k1] != 'w' && c1 == 'w') c1 = ca[k1];
			if (ca[k1] != c1 && c1 != 'w' && ca[k1] != 'w') {
				break;
			}
			a++;
			
		}
		for (int k2 = i - 1; k2 >= 1; k2--) {
			if (ca[k2] != 'w' && c2 == 'w') c2 = ca[k2];
			if (ca[k2] != c2 && c2 != 'w' && ca[k2] != 'w') {
				break;
			}
			b++;
		}

		if (a + b > res) res = a + b;
	}

	if (res >= n) fout << n << endl; 
	else fout << res << endl;


	return 0;
}
【上篇】
【下篇】

抱歉!评论已关闭.