模拟题,遍历项链,选择断点,然后双向搜索,应该注意项链是循环的,为了避免重复搜索,用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;
}
本文介绍了一种针对循环项链上珠子收集问题的算法实现。该算法通过遍历项链选择不同断点,并采用双向搜索策略收集最多数量的相同颜色珠子(考虑白色珠子可作为任意颜色)。特别地,当所有珠子均为白色时,直接返回项链长度。
486

被折叠的 条评论
为什么被折叠?



