您的位置:首页 > 其它

USACO 1.1.4 Broken Necklace

2012-02-20 20:21 375 查看
模拟题,遍历项链,选择断点,然后双向搜索,应该注意项链是循环的,为了避免重复搜索,用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: