背景:困扰了我昨天一个晚上,原来开始的想法一直是不对的,我一直凭借直觉感觉(没有任何理论依据)认为必须在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