首页 > 代码库 > USACAO beads

USACAO beads

背景:困扰了我昨天一个晚上,原来开始的想法一直是不对的,我一直凭借直觉感觉(没有任何理论依据)认为必须在r和b的交接点切分才会到达最多豆子。最后我在草稿本上列举出了一种不符合的情况,才开始改程序。

思路:就是对每一个分割点进行计算看它能有多少个豆子,取所有分割点中豆子最多的。

心得:对于算法我以前抱有评感觉做得陋习,而没有去深究并尝试证明,这样终将导致出错。深入问题本身,用逻辑严密的方法分析清楚所有情况。

/*
ID:jibanca1
LANG:C++
TASK:beads
*/
#include<stdio.h>
#include<string.h>
bool pan(char x,char y);
  bool pan(char x,char y){
  	if(x=='w'||y=='w') return true;
  	else if(x==y) return true;
  	else return false;
  }
int main(void){
	freopen("beads.in","r",stdin);
	freopen("beads.out","w",stdout);
	int n,max=0;
	scanf("%d",&n);
	char str[1000];
	scanf("%s",str); 
	for(int i=0,ii;i<n;i++){
		if(i==n-1) ii=0;
		else ii=i+1;
			int count=0;
			for(int j=i;;j--){
			    if(str[j]!='w'&&str[i]=='w') str[i]=str[j];    //对于结点开始处是w的情况,它的颜色由其后首先预见的颜色决定
				if(!pan(str[j],str[i])){
					if(i>j)
					count=i-j;
					else count=n-j+i;
					break;
				}
				if(j==i+1){                                  //对于全是一种颜色的情况
				   max=n;
				   goto l1;	
				} 
			    if(j==0) j=n; 	
			}
			for(int k=ii;;k++){
				if(k==n) k=0;
				if(str[k]!='w'&&str[ii]=='w') str[ii]=str[k];
				if(!pan(str[k],str[ii])){
					if(k>ii)
					count+=k-i-1;
					else count+=n-ii+k	;
					break;
				}
			}
			if(count>max) max=count;
		
	}
l1:	printf("%d\n",max);
	return 0;
}


USACAO beads