注:此題感覺我是因爲小學數學沒學好就被繞進去了,而且這個珠子裏有陷阱:(然後我就死了。再加上這週一直在玩QT就一直停在這兒了。
此題關鍵就是把每一段給求出來。
代碼來自:http://blog.sina.com.cn/s/blog_ad13c2900101knl1.html
因爲確實暫時沒做出來,只能貼出上邊博客裏的代碼。待仔細研究後但願能自己寫出來吧TAT
你有一串由紅珠子、白珠子和藍珠子組成的項鍊,珠子的數量大於等於3小於等於350.珠子隨機排列。
下邊是兩個例子:
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
第一個珠子和第二個珠子的位置在圖上標出來了。圖Figure A 中的排列可表示爲brbrrrbbbrrrrrbrrbbrbbbbrrrrb。
如果你在某個點把這串項鍊弄斷,然後把它拉直。然後一直收集一種顏色的珠子,直到遇到另一個顏色。一直這麼做直到把把這串項鍊的珠子找完。
確定斷點位置保證最大數量的珠子能夠被收集到。
*白珠子既可以被看做藍珠子也可以被看作紅珠子。
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream fin("beads.in");
ofstream fout("beads.out");
int before,after;
int n;
int p = 0;
char necklace[800];
char current_color;
int max = 0;
fin>>n;
fin >> necklace;
for(int i = 0;i < n;i ++)
necklace[i+n] = necklace[i];
necklace[n*2] = '\0';
before = 0;
while(necklace[p] == 'w')
{
before++;
p++;
}
current_color = necklace[p];
while((necklace[p] == current_color|| necklace[p] == 'w') && p<n)
{
before++;
p++;
}
if(p < n)
{
while(p < 2*n)
{
current_color = necklace[p];
after = 0;
while(necklace[p] == current_color|| necklace[p] == 'w')
{
after++;
p++;
}
if(before + after > max && before+after <= n)
{
max = before+after;
}
before = after;
int j = p-1-before;
while(necklace[j] == 'w')
{
before++;
j--;
}
}
}
else
max = n;
fout << max<<endl;
}