Sorting a Three-Valued Sequence 三值的排序

 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.


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值