Section 1.1 Broken Necklace

本文探讨了一种解决复杂项链配色问题的高效算法,通过细致的搜索策略和巧妙的边界处理,实现对项链颜色组合的最大优化。文章详细介绍了算法的核心思想,包括如何避免不必要的循环、有效判断圈状结构以及如何在搜索过程中进行优化,以减少计算复杂度。此外,还提供了一个实际应用示例,展示如何将该算法应用于具体问题中。

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

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

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.

 

转载于:https://www.cnblogs.com/Sky-Grey/archive/2013/01/18/2865701.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值