USACO 1.1 Broken Necklace

这道题中项链是环形的,我们可以把两条项链放在一起就可以省去数据处理取摸运算。我们可以设置两个关键变量sum_cur(记录断开处后边满足条件的序列) sum_pur(记录断开处前边满足条件的序列),题目一共有三种颜色的珠子。遇到白色珠子时白色珠子数目加一(sum_w++),sum_cur++。遇到的不是白色珠子,而且和前边那个珠子的颜色不同,就看看能收集到的珠子数目是否会有变化,更新sum_pur,sum_w,sum_cur。遇到的不是白色珠子但是和前一个珠子颜色相同,就更新一下sum_cur。

/*
	ID: acmerfi1
	PROG: beads
	LANG: C++
*/
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX 1000
using namespace std;

int N, sum_w = 0, sum_cur = 0, sum_pur = 0, max_sum = 0;
char str[MAX], ch, nowc = '0';

int main()
{
	freopen("beads.in", "r", stdin);
	freopen("beads.out", "w", stdout);
	scanf("%d", &N);
	getchar();
	memset(str, 0, sizeof(str));
	for(int i = 0; i < N; i++)
	{
		scanf("%c", &str[i]);
	}
	memcpy(str+N, str, N);
	for(int i = 0; str[i] && max_sum < N; i++)
	{
		if('w' == str[i]) sum_w++, sum_cur++; 
		else if(nowc != str[i])
		{
			if(max_sum < sum_cur + sum_pur) max_sum = sum_pur + sum_cur;
			sum_pur = sum_cur - sum_w;
			sum_cur = sum_w + 1;
			sum_w = 0, nowc = str[i];
		}
		else sum_cur++, sum_w = 0;		
	}
	if(max_sum < sum_cur + sum_pur) max_sum = sum_pur + sum_cur;
	printf("%d\n", max_sum > N ? N : max_sum);
	return 0;
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值