注:此题感觉我是因为小学数学没学好就被绕进去了,而且这个珠子里有陷阱:(然后我就死了。再加上这周一直在玩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;
}