模擬題,遍歷項鍊,選擇斷點,然後雙向搜索,應該注意項鍊是循環的,爲了避免重複搜索,用vis數組來標記搜索過的珠子。每次記錄最大可以收集的珠子數,與最大值做比較。本題要注意斷點爲w時的處理方法,特殊地,當珠子全爲w時,輸出n(即項鍊長度)。
代碼如下:
/*
ID: michael139
LANG: C
PROG: beads
*/
#include<stdio.h>
#include<string.h>
int main () {
FILE *fin = fopen ("beads.in", "r");
FILE *fout = fopen ("beads.out", "w");
int n,i,j,max,cur,ok,x,vis[1010];
char s[1010],c;
while (fscanf(fin,"%d",&n)!=EOF) {
fscanf(fin,"%s",s);
max = 0;
ok = 1;
for (i=0;i<n;i++) {
memset(vis,0,sizeof(vis));
c = s[i];
cur = 1;
vis[i] = 1;
for (j=(i+1)%n;cur<n;j++) {
j %= n;
while (c=='w') {
c = s[j];
cur ++;
vis[j] = 1;
j++;
j = j%n;
if (cur>=n) {
ok = 0;
break;
}
}
if (!vis[j] && (s[j]==c)||(s[j]=='w')) {
cur ++;
vis[j] = 1;
} else break;
}
c = s[(n+i-1)%n];
if (ok) for (j=(n+i-1)%n;cur<n;j--) {
j %= n;
while (c=='w') {
c = s[j];
cur ++;
vis[j] = 1;
j++;
j = j%n;
if (cur>=n) {
ok = 0;
break;
}
}
if (!vis[j] && (s[j]==c)||(s[j]=='w')) {
cur ++;
vis[j] = 1;
} else break;
}
if (max<cur) {
max = cur;
x = i;
}
}
fprintf(fout,"%d\n",ok?max:n);
}
return 0;
}