網教12.編程珠璣

你有一條項鍊,它由 N 個隨機排列的紅、白和藍色的珠子組成(3<=N<=350)。下面的例子展示了兩條 N=29 時的項鍊:

               1 2                               1 2
           r b b r                           b r r b
          r         b                       b         b
         r           r                     b           r
        r             r                   w             r
       b               r                 w               w
      b                 b               r                 r
      b                 b               b                 b
      b                 b               r                 b
       r               r                 b               r
        b             r                   r             r
         b           r                     r           r
           r       r                         r       b
             r b r                            r r w
          Figure A                     Figure B
                        r red bead
                        b blue bead
                        w white bead
項鍊上的第一個和第二個珠子已經在圖中標出了。

圖 A 也可以用一個由 b 和 r 組成的字符串直接表示,b 代表藍色而 r 代表紅色,如下所示:brbrrrbbbrrrrrbrrbbrbbbbrrrrb。

假設你想從項鍊的某處將它截斷拉直;接着從一端向另外一端數收集同顏色的珠子,直到碰到一個不同顏色的珠子爲止;然後再從另外一端做同樣的操作。(一端收集的珠子顏色可以不同於另一端的。)

請想辦法找到一個截斷項鍊的位置,能夠讓我們儘量多地收集到同色的珠子。

例子

如圖 A 中的項鍊,從第 9 和第 10 個或者第 24 和 第 25 個珠子中間截斷,則我們可以收集到 8 個珠子。

圖 B 中的項鍊有白色的珠子,當遇到白色的珠子時,它既可以作爲藍色的珠子看待,也可以作爲紅色的珠子看待,由收集珠子時的需求決定。包含有白色珠子的項鍊則會由 r、b 和 w 字符組成的字符串來表示。

請編寫一個程序計算從某條項鍊中能夠收集到多少個珠子。

輸入格式

第一行: N,項鍊上珠子的個數

第二行:一個字符串,長度爲 N,由 r、b 和 w字符組成

輸入樣例

29 wwwbbrwrbrbrrbrbrwrwwrbwrwrrb

輸出格式

輸出一行字符,它應該包含了計算出的結果。

輸出樣例

11
  測試輸入關於“測試輸入”的幫助 期待的輸出關於“期待的輸出”的幫助 時間限制關於“時間限制”的幫助 內存限制關於“內存限制”的幫助 額外進程關於“{$a} 個額外進程”的幫助
測試用例 1 以文本方式顯示
  1. 29↵
  2. wwwbbrwrbrbrrbrbrwrwwrbwrwrrb↵
以文本方式顯示
  1. 11↵
1秒 1024KB 0
題解:

看着這是一個不錯的題,如果數據量足夠大的話可以進行剪枝或者什麼更好的方法,可惜數據量太水,直接一次循環就能過~

#include<stdio.h>  
#include<string.h>  
char readin[750];  
  
int main()  
{  
    int n;  
    scanf("%d%s", &n, readin);  
    int i;  
    for (i = 0; i < n; i++)  
        readin[n + i] = readin[i];  
    int maxe = 0;  
    int j;  
    int index1, index2;  
    int flag1, flag2;  
    for (i = 0; i < n; i++)  
    {  
        index1 = 0; index2 = 0;  
        flag1 = 0; flag2 = 0;  
        for (j = i; j < n+i; j++)  
        {  
            if (readin[j] == 'b' && flag1!=2)  
                flag1 = 1;  
            if (readin[j] == 'r' && flag1!=1)  
                flag1 = 2;  
            if ((readin[j] == 'b'&&flag1 == 2) || (readin[j] == 'r'&&flag1 == 1))  
                break;  
            index1++;  
        }  
        for (j = n + i - 1; j >= i; j--)  
        {  
            if (readin[j] == 'b' && flag2 != 2)  
                flag2 = 1;  
            if (readin[j] == 'r' && flag2 != 1)  
                flag2 = 2;  
            if ((readin[j] == 'b'&&flag2 == 2) || (readin[j] == 'r'&&flag2 == 1))  
                break;  
            index2++;  
        }  
        maxe = maxe > (index1 + index2) ? maxe : (index1 + index2);  
    }  
    if (maxe > n)  
        maxe = n;  
    printf("%d\n", maxe);  
    return 0;  
}  



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