1. 程式人生 > >壞掉的項鏈Broken Necklace

壞掉的項鏈Broken Necklace

bbbb for 一個 space 哪裏 註釋 img cout 枚舉

你有一條由N個紅色的,白色的,或藍色的珠子組成的項鏈(3<=N<=350),珠子是隨意安排的。 這裏是 n=29 的二個例子:

技術分享圖片

第一和第二個珠子在圖片中已經被作記號。

圖片 A 中的項鏈可以用下面的字符串表示:

brbrrrbbbrrrrrbrrbbrbbbbrrrrb

假如你要在一些點打破項鏈,展開成一條直線,然後從一端開始收集同顏色的珠子直到你遇到一個不同的顏色珠子,在另一端做同樣的事(顏色可能與在這之前收集的不同)。 確定應該在哪裏打破項鏈來收集到最大數目的珠子。

例如,在圖片 A 中的項鏈中,在珠子 9 和珠子 10 或珠子 24 和珠子 25 之間打斷項鏈可以收集到8個珠子。

白色珠子什麽意思?

在一些項鏈中還包括白色的珠子(如圖片B) 所示。

當收集珠子的時候,一個被遇到的白色珠子可以被當做紅色也可以被當做藍色。

表現含有白珠項鏈的字符串將會包括三個符號 r , b 和 w 。

寫一個程序來確定從一條被給出的項鏈可以收集到的珠子最大數目。

輸入輸出格式

輸入格式:

第 1 行: N, 珠子的數目

第 2 行: 一串長度為N的字符串, 每個字符是 r , b 或 w。

輸出格式:

輸出一行一個整數,表示從給出的項鏈中可以收集到的珠子的最大數量。

思路:剛開始看到時就想著可以暴力枚舉,打表,枚舉每次斷開在哪裏,結果只得了40分,後來看數據才知道n<=350,n=350時必然超時......所以後來我問了老師後換了思路,用模擬的算法來體現摸到紅珠子或藍珠子,白珠子(可紅可藍),繼續摸到上一個珠子的顏色的珠子這三種情況,在實時更新ans的值,保證不重不漏。

代碼如下(有註釋):

#include<bits/stdc++.h>
using namespace std;
char s[700],c;
int a,b,w,ans;
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)//輸入
cin>>s[i];
memcpy(s+n,s,n);
for(int i=0;i<n<<1;i++)//循環開始!
{
if(s[i]==‘w‘){//如果字母是w(顏色是紅色或藍色)
b++;//所以白藍數量各加1
w++;
}
else if(s[i]==c){//如果字母是c(當前連續字母)
b++;//藍色加一
w=0;//白色清零
}
else{//是正常字母(單紅或單藍)
ans=max(ans,a+b);//更新當前最大連續數量
a=b-w;//a,b值更新
b=w+1;
w=0;//白色清零
c=s[i];//當前連續字母更換
}
}
ans=max(ans,a+b);//再次更新ans值
cout<<min(ans,n);//輸出
return 0;//完美結束代碼
}

壞掉的項鏈Broken Necklace