Sorting a Three-Valued Sequence 三值的排序
排序是一种很频繁的计算任务.现在考虑最多只有三值的排序问题.一个实际的例子是,当我们给某
项竞赛的优胜者按金银铜牌序的时候.
在这个任务中可能的值只有三种 1,2 和 3.我们用交换的方法把他排成升序的.
写一个程序计算出,给定的一个 1,2,3 组成的数字序列,排成升序所需的最少交换次数.
PROGRAM NAME: sort3
INPUT FORMAT
Line 1: N (1 <= N <= 1000)
Lines 2-N+1: 每行一个数字,共 N 行.(1..3)
SAMPLE INPUT (file sort3.in)
9
2
2
1
3
3
3
2
3
1
OUTPUT FORMAT
共一行,一个数字.表示排成升序所需的最少交换次数.
SAMPLE OUTPUT (file sort3.out)
4
======================
在很难判断的情况下..要敢于写搜索...
善于评估数据范围...
-----------------------------
用到DP无后效性思想...
===========================
{
ID:jie19952
PROG:sort3
LANG:PASCAL
}
var
n:longint;
a,f:array[1..1000]of longint;
nums,long:array[1..3]of longint;
// change:array[1..3,1..3]of longint;
procedure init;
begin
assign(input,'sort3.in');
assign(output,'sort3.out');
reset(input); rewrite(output);
end;
procedure terminate;
begin
close(input); close(output);
halt;
end;
procedure main;
var
i,j,k:longint;
ans,tem:longint;
begin
readln(n);
fillchar(nums,sizeof(nums),0);
//fillchar(change,sizeof(change),0);
for i:=1 to n do
begin
read(a[i]);
inc(nums[a[i]]);
end;
for i:=1 to nums[1] do f[i]:=1;
for i:=nums[1]+1 to nums[1]+nums[2] do f[i]:=2;
for i:=nums[1]+nums[2]+1 to n do f[i]:=3;
long[1]:=nums[1]+1;
long[2]:=nums[1]+nums[2]+1;
ans:=0;
for i:=1 to long[2]-1 do
begin
if a[i]>f[i] then
begin
inc(ans);
if a[i]=2 then
for j:=long[f[i]] to n do
if a[j]=f[i] then
begin
tem:=a[i];
a[i]:=a[j];
a[j]:=tem;
break;
end;
if a[i]=3 then
for j:=n downto long[f[i]] do
if a[j]=f[i] then
begin
tem:=a[i];
a[i]:=a[j];
a[j]:=tem;
break;
end;
end;
end;
writeln(ans);
end;
begin
init;
main;
terminate;
end.