开关结构(AHOI1999)

本文介绍了一种电路中开关最少触发次数的算法实现。该算法通过分析电路的串联与并联结构,利用栈结构来统计每层电路中所需开关的最小数量。具体而言,对于串联结构,需要打开所有开关;而对于并联结构,则选择打开最少数量的开关。
算法:数据结构

分析:一开始想到用栈了但是具体的做不出来,简单说下思路。
      问最少打开多少开关可以实现通路,可以分两种情况:
      1.串联,串联的话有多少开关就得打开多少开关,因此直接计算即可。

      2.并联,并联的话就要在所有并的开关中保证需要的开关最少就行。

program electricsswitchstruck;

const 
 maxn=1000;

var
 top,i:longint;
 s:ansistring;
 minn,ans:array [0..maxn] of longint;
 
function min(x,y:longint):longint;
begin
 if x<y then exit(x) else exit(y);
end;

begin
 assign(input,'electricsswitchstruck.in'); reset(input);
 assign(output,'electricsswitchstruck.out'); rewrite(output);
 
 while not eof do 
  begin
   minn[0]:=maxlongint;
   ans[0]:=0;
   top:=0;  
   readln(s);
   s:=s+'+';
   for i:=1 to length(s) do
    begin
     case s[i] of
      'K':inc(ans[top]);
      '+':begin{碰到并联永远是取最小的,同时也要初始化为下一次计算加号作准备。}
           minn[top]:=min(minn[top],ans[top]);
           ans[top]:=0;
          end;
      {在统计的时候我们把括号里面的看成一层,把括号外面的看成另外一层。最外面的一层是第0层。}
      '(':begin
		   inc(top);
		   minn[top]:=maxlongint;
		   ans[top]:=0;
		  end;
	  {右括号有两个含义,一个是表示括号的结束,另一个是表示上一层部分的中止,这时我们要结束这一层,同时把括号内的一层的开关数返回上一层。}
      ')':begin		   
		   inc(ans[top-1],minn[top]);
		   dec(top);	
          end;      
     end;{case}
    end;
   write(minn[0]); 
  end;
 
 close(input); close(output);
end.



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值