这么个所谓简单的题目弄了一下午加一晚上,呵呵,怎么也算不对。
一定会有一个简单的方法。
晚上去新都回来后,又坐在电脑面前思索这个问题。
多次删除写出的眼看就要成功的代码,因为不够简洁。
突然顿悟:
1.串相联;
假设数数当前位置为pos;
2.k[pos]==‘w‘,不可能是最大。
3.k[pos+1]==‘w‘,不可能是最大。
4.k[pos]=k[pos+1],不可能是最大。
5.pos==0,不能往左数。
所以,
6.只有k[pos]!=k[pos+1]才有可能数出最大:
即‘r‘,‘b‘,或‘b‘,‘r‘这种组合才可能最大。
所以,最后的算法是,找到合适的pos,
从pos往左数+从pos+1往右数这些组合,找出最大的,呵呵!
/* ID: qq104801 LANG: C TASK: beads.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> /* for debug only:counter */ void debug_dummy(void) { return; } int n; char k[600]; int count(int pos) { int index=0; int l=1,r=1; if (k[pos]==‘w‘ || k[pos+1]==‘w‘ || k[pos]==k[pos+1] || pos<1) return 1; index=pos; while(--index && index>=0) { if ((k[index]==k[pos]) || (k[index]==‘w‘)) l++; else break; } index=pos+1; while(++index && k[index]!=‘\0‘) { if ((k[index]==k[pos+1]) || (k[index]==‘w‘)) r++; else break; } //printf("pos:%d l:%d r:%d l+r:%d\n",pos,l,r,l+r); return l+r; } void init() { int i; int cc=0; char c1,c2; c1=‘\0‘; i=n-1; while(i++) { cc++; k[i]=k[i-n]; if (k[i]!=k[0]) { c1=k[i]; } if (c1!=‘\0‘ && k[i]!=c1) break; } k[++i]=‘\0‘; //printf("cc;%d\n",cc); //printf("k:%s\n",k); } main () { FILE *fin = fopen ("beads.in", "r"); FILE *fout = fopen ("beads.out", "w"); fscanf(fin,"%d",&n); fscanf(fin,"%s",&k); //printf("n:%d\n",n); //printf("k:%s\n",k); init(); int i; int max,t; t=0; max=0; for(i=0;i<n;i++) { t=count(i); if (max<t) max=t; } //printf("max:%d\n",max); fprintf(fout,"%d\n",max); fclose(fin); fclose(fout); exit (0); }
时间: 2024-10-03 23:19:50