【普组模拟赛】战马列队
题目:
马年到了,也到了检阅战马的时候。战马分为白色和棕色两种,一字排开,指挥官希望他的战马队列尽可能整齐好看,将相同颜色的战马放在一起。
大部分人都喜欢高头白马,因此,指挥官要求白马排在前面,棕马排在后面。现在, N匹战马都已经在广场列队。为了达到要求,指挥官可以调换任意一个位置上的战马(有充足的备用战马)。问至少调换多少匹可以达到要求。
水题...
我们从前往后做一次前缀和(W和B分开做)
从后往前也做一次
然后枚举每个点
如果是B,那么当前点的答案就是前面的B的个数+后面的W的个数
如果小于答案,就更新
最后特判一下如果把所有的W换成B或者把所有的B换成W的步数比答案更小就更新
比赛时想复杂了,打了个复杂的DP
费了码量和时间不说,还只有30分
气死我也
标程(请勿抄袭,后果很严重):
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.