usaco training的**又進不去了,所以我將刷題**轉到了acwing。
這個**上的相關題目是已經經過翻譯了的,比較友好。我個人購買了acwing上y總的usaco training習題輔導的網課,對刷題很有幫助。
牛課上也可以找到這套題的漢化版,但是個人還是更喜歡acwing,因為當題目wa掉的時候,他會給出wa了的測試資料。
鏈結:
例如 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
樣例 a 樣例 b
r 紅珠子
b 藍珠子
w 白珠子
對項鍊的第一顆珠子和第二顆珠子進行了標記。
樣例 a 中的項鍊只包含藍紅兩種顏色的珠子,將所有珠子按順序記錄顏色為:
brbrrrbbbrrrrrbrrbbrbbbbrrrrb
假設你現在要將項鍊從某個點處斷開,並將斷開後的項鍊拉直擺放,然後從一端開始收集相同顏色的珠子,直到碰到另一種顏色的珠子為止,完成後在另一端進行相同的操作(這次收集的珠子的顏色可能與之前收集的顏色並不相同)。
現在,你需要判斷在項鍊的哪一處將項鍊斷開,可以使得我們收集珠子的數量達到最多。
例如,對於樣例 a 提供的項鍊,我們在 9 號珠子和 10號珠子之間斷開項鍊,或者在 24 號珠子和 25 號珠子之間斷開項鍊,可以收集到最多 8 個珠子。
另外,某些項鍊除藍紅珠子外,還包含白珠子,如樣例 b 所示。
收集珠子時,如果我們遇到了白色珠子,那麼我們可以將它視為紅色或藍色,並將其塗上相應的顏色。
表示項鍊的字串只包含 r,w,b 三種字元。
請你編寫乙個程式,求出我們可以收集珠子的最大數目。
輸入格式
第一行包含整數 n,表示珠子的數量。
第二行包含乙個由 n 個字元構成的字串,字串中只包含r,w,b 三種字元。
輸出格式
共一行,包含乙個整數表示我們可以收集珠子的最大數目。
資料範圍
3 ≤ n ≤ 350
輸入樣例:
29
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb
輸出樣例:
11
題目的理解:
項鍊是乙個圈,從不同的點斷開向量我們會得到不同的線形項鍊。從所得線性項鍊的兩端開始取珠子,直至珠子顏色與之前所取顏色不同(白色珠子既可以當作紅色也可以當作藍色)。問這個項鍊最多能取到多少珠子。
我們在某個位置打斷項鍊是不破壞項鍊珠子的。也就是說,對於乙個長為n的項鍊,其答案的最大值是n。我一開始理解錯了題意,導致wa了一次。
做題思路:
這個題的資料範圍是很小的,所以我們可以通過列舉的方法求解。遍歷從每乙個點斷開時形成的線性項鍊可以取到的珠子個數,取最大值即可。
小技巧:
項鍊是乙個圈,而我們儲存的時候存的是乙個陣列,所以從某點斷開後形成的線形項鍊不方便直接表示。
我們可以在當前陣列的尾部再接上一次當前陣列。這樣,我們從某個點斷開後形成的線性項鍊,就是當前點再向後取n - 1個點。
即,從2號點斷開後形成的項鍊是2 ~ 2+n-1。我們只需遍歷0 ~ n-1即可。
#include #include #include using namespace std;
int n, ans = 0;
int left, right;
char necklace[1000];
int main()
for (int i = 0; i < n; i++)
else if (nowcolor != 0 && necklace[j] != 'w' && necklace[j] != nowcolor)
left++;
}nowcolor = 0;
for (int j = end; j >= start; j--)
else if (nowcolor != 0 && necklace[j] != 'w' && necklace[j] != nowcolor)
right++;
}ans = max(ans, left + right);
}if (ans > n)
cout << ans << endl;
system("pause");
return 0;
}
如果該題解對您有幫助的話,希望您不吝點讚。
歡迎討論交流,期待共同進步!
USACO Section1 2破碎的項鍊
很明顯使用模擬的方法進行搜尋。但是一開始只是憑感覺寫了出來,有些樣例沒有過,仔細想想才明白自己沒有完全明白怎樣模擬,下面是大體思路 如果開始是一串連續的w 記錄下它的數目,直到遇到一串或乙個b或 r,再把它們的數目加在一起,作為一次可能的結果。如果開始是乙個或一串b或 r記錄下它的數目,直到遇到乙個...
USACO 1 1 破碎的項鍊
description 你有一條由n個紅色的,白色的,或藍色的珠子組成的項鍊 3 n 350 珠子是隨意安排的。這裡是 n 29 的二個例子 r 代表 紅色的珠子 b 代表 藍色的珠子 w 代表 白色的珠子 第一和第二個珠子在中已經被作記號。brbrrrbbbrrrrrbrrbbrbbbbrrrrb...
7 4 1 1 4 破碎的項鍊 80分
7 4 1.1.4 破碎的項鍊 80分 你有一條由 n 個紅色的,白色的,或藍色的珠子組成的項鍊 3 n 350 珠子是隨意安排的.這裡 是 n 29 的二個例子 第一和第二個珠子在中已經被作記號.a 中的項鍊可以用下面的字串表示 brbrrrbbbrrrrrbrrbbrbbbbrrrrb 假如你要...