USACO 1.1.4 Broken Necklace

模擬題,遍歷項鍊,選擇斷點,然後雙向搜索,應該注意項鍊是循環的,爲了避免重複搜索,用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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章