前言
“逐梦之人必与时间角逐,追逐红日东升,直至暗夜升空。瞭望银月,仰望满天星辰,握紧双拳,向梦想坚定奔去。”欢迎来到嘟嘟课堂。今天给大家刷道水题——战马列队。
题目描述
马年到了,也到了检阅战马的时候。战马分为白色和棕色两种,一字排开,指挥官希望他的战马队列尽可能整齐好看,将相同颜色的战马放在一起。
大部分人都喜欢高头白马,因此,指挥官要求白马排在前面,棕马排在后面。现在, N匹战马都已经在广场列队。为了达到要求,指挥官可以调换任意一个位置上的战马(有充足的备用战马)。问至少调换多少匹可以达到要求。
输入
第一行一个整数 N, 表示已经排队的战马数量。
第二行一个字符串,表示当前队列从前到后战马的颜色,只包含两种字符,”W”表示白马,”B”表示黑马。
输出
输出一个数字,表示至少需要调换多少匹战马。
样例输入1
5
WWWBB
样例输出1
0
样例说明1
已经符合白马在前,棕马在后,不需要调换。
样例输入2
5
WBWBW
样例输出2
2
样例说明2
可以把棕马都换成白马 WWWWW,或者 WWWBB,都是符合要求的队列,至少调换2 匹。
数据范围限制
30%的数据 N<=20。
70%的数据 N<=500。
100%的数据 N<=1000。
思路
水题…
我们从前往后做一次前缀和(W和B分开做),从后往前也做一次,然后枚举每个点。
如果是B,那么当前点的答案就是前面的B的个数+后面的W的个数
如果小于答案,就更新。
代码
var
st:ansistring;
n,i,j,k,l,s,x:longint;
f1,f2:array[0..1001,1..2]of longint;
g:array[0..1001,0..1]of longint;
begin
assign(input,'queue.in');
assign(output,'queue.out');
reset(input);
rewrite(output);
readln(n);
readln(st);
for i:=n downto 1 do
begin
f1[i]:=f1[i+1];
case st[i] of
'W':inc(f1[i,1]);
'B':inc(f1[i,2]);
end;
end;
for i:=1 to n do
begin
f2[i]:=f2[i-1];
case st[i] of
'W':inc(f2[i,1]);
'B':inc(f2[i,2]);
end;
end;
s:=maxlongint;
for i:=1 to n do
case st[i] of
'B':if(s>f2[i,2]+f1[i,1]-1) then s:=f2[i,2]+f1[i,1]-1;
end;
if s>f1[1,2] then s:=f1[1,2];
if s>f1[1,1] then s:=f1[1,1];
writeln(s);
close(input);
close(output);
end.