算法:数据结构
分析:一开始想到用栈了但是具体的做不出来,简单说下思路。
问最少打开多少开关可以实现通路,可以分两种情况:
1.串联,串联的话有多少开关就得打开多少开关,因此直接计算即可。
分析:一开始想到用栈了但是具体的做不出来,简单说下思路。
问最少打开多少开关可以实现通路,可以分两种情况:
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.
本文介绍了一种电路中开关最少触发次数的算法实现。该算法通过分析电路的串联与并联结构,利用栈结构来统计每层电路中所需开关的最小数量。具体而言,对于串联结构,需要打开所有开关;而对于并联结构,则选择打开最少数量的开关。
2015

被折叠的 条评论
为什么被折叠?



