背景:困扰了我昨天一个晚上,原来开始的想法一直是不对的,我一直凭借直觉感觉(没有任何理论依据)认为必须在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;
}原文地址:http://blog.csdn.net/jibancanyang/article/details/41950263