USACO1.1 Broken Necklace

很简单的模拟题,但是noip的奶酪20分后我觉得模拟题也是需要认真考量的。

写这题的时候,我的目标是一次A过,想了一些些特殊情况,真的找出了bug。

一个字符串(3<=长度<=350),选择两个字符中间的位置作为起点,向左右分别计数相同字符的个数,左右累加为答案。求最大答案。

共3种字符,其中'w'可表示任意字符。

本题,一定有解,且最小解为2.

#include<iostream>
using namespace std;

char x[400];
int n,ans;

void fix(int &x)
{
	if(x==-1)
		x=n-1;
	else if(x==n)
		x=0;
}

void sch(int l)
{
	int r=l+1;fix(r);
	char lc=x[l],rc=x[r];
	int cnt=0;
	while(lc=='w' or x[l]==lc or x[l]=='w')
	{	
		if(cnt==n)
			break;
		cnt++,
		lc=(lc=='w'?x[l]:lc),
		l--,fix(l);
	}
	while(rc=='w' or x[r]==rc or x[r]=='w')
	{	
		if(cnt==n)
			break;
		cnt++,
		rc=(rc=='w'?x[r]:rc),
		r++,fix(r);
	}
	ans=max(ans,cnt);
}

int main()
{
	ios::sync_with_stdio(0);
	cin>>n;
	for(int i=0;i<n;i++)
		cin>>x[i];
	for(int i=0;i<n;i++)
		sch(i);
	cout<<ans;
	return 0;
}

特殊情况

字符串全是'w'。答案为n,需要特判退出。

交第一次就过啦,加上之前写的,uasco1已经写完。

posted @ 2017-12-23 09:40  syhien  阅读(101)  评论(0编辑  收藏  举报