只能说这真的是一道好题目,考验耐心细心…

尼玛提交了六次!(有一次是因为忘记开文件了!)智商拙计了!

a数组用于存储项链的颜色,ans用于存储当前最大解。

函数cut中:l、r分别表示左右搜索端点;x00表示左搜索用于比较的端点,x0表示右搜索用于比较的端点。

需要注意:

1. 可能一个圈都是一个颜色,预判避免死循环。

2. 向两边搜的时候,注意如果达成一个圈了搜索就停止,输出n。

3. 向左边搜,起始节点l,但是l可能是白色,因此不能单单和a[l]作比较。

4. 本程序在项链成环方面可以继续用mod优化。

Beads
var a:array[1..350] of integer;
    c:char;
    ans,n,i,t:integer;
    flag:boolean;
function cut(x:integer):integer;
var l,r,x00,x0,answer:integer;
begin
  l:=x;r:=x+1; x0:=x+1; x00:=x;
  if r>n then
    begin
      r:=1;
      x0:=1;
    end;
  while a[x00]=3 do
    begin
      dec(x00);
      if x00<1 then x00:=n;
    end;
  while a[x0]=3 do
    begin
      inc(x0);
      if x0>n then x0:=1;
    end;
  while (a[l]=a[x]) or (a[l]=3) do
    begin
      dec(l);
      if l<1 then l:=n;
    end;
  while (a[r]=a[x0]) or (a[r]=3) do
    begin
      inc(r);
      if r>n then r:=1;
      if r=l then exit(n);
    end;
  answer:=r-l-1;
  if answer<0 then answer:=answer+n;
  cut:=answer;
end;

begin
  assign(input,'beads.in');reset(input);
  assign(output,'beads.out');rewrite(output);
  readln(n);
  for i:=1 to n do
    begin
      read(c);
      case c of
        'r':a[i]:=1;
        'b':a[i]:=2;
        'w':a[i]:=3;
      end;
    end;
  flag:=false;
  for i:=1 to n-1 do
    if (a[i]<>a[i+1]) and (a[i]<>3) then
      begin
        flag:=true;
        break;
      end;
  if (a[1]<>a[n]) and (a[n]<>3) then flag:=true;
  if not flag then
    begin
      writeln(n);
      close(input);
      close(output);
      halt;
    end;
  for i:=1 to n do
    if a[i]<>a[i+1] then
      begin
        t:=cut(i);
        if t>ans then ans:=t;
      end;
  writeln(ans);
  close(input);close(output);
end.

 

 posted on 2013-01-18 01:02  Sky-Grey  阅读(142)  评论(0编辑  收藏  举报