您的位置:首页 > 产品设计 > UI/UE

Section 2.1 Sorting A Three-Valued Sequence

2010-08-24 18:03 567 查看
用一个数组存原始数据, 一个数组存目标数据
再用一个记录数组 存1,2,3的开始数据与结束的位置
然后找可以一次匹配的,  通过一次交换使两个数都到目标位置的, ans + 1
找完以后再找 3个匹配的, 这需要2次交换 ans + 2
输出ans即可
{
ID: yaoyuan4
PROG: sort3
LANG: PASCAL
}
Program sort3;
type
  date = record
   op, ed : longint;
  end;
const
  maxn = 1000; inf = 'sort3.in'; outf = 'sort3.out';
var
  n, ans : longint;
  a, b : array[1..maxn] of longint;
  fx : array[1..3] of longint;
  f : array[1..3] of date;
Procedure swap(var a, b : longint);
  var
   t : longint;
  begin
   t := a;
   a := b;
   b := t;
  end;
Procedure init;
  var
   i, j : longint;
  begin
   fillchar(fx, sizeof(fx), 0);
   assign(input, inf); reset(input);
   readln(n);
   for i := 1 to n do
    begin
     readln(a[i]);
     inc(fx[a[i]]);
    end;
   close(input);
   f[1].op := 1; f[1].ed := fx[1];
   f[2].op := f[1].ed + 1; f[2].ed := f[2].op + fx[2] - 1;
   f[3].op := f[2].ed + 1; f[3].ed := n;
   for i := 1 to 3 do
    for j := f[i].op to f[i].ed do
     b[j] := i;
  end;
Procedure work;
  var
   i, j, k : longint;
  begin
   for i := 1 to n do
    if a[i] <> b[i] then
     for j := f[a[i]].op to f[a[i]].ed do
      if b[i] = a[j] then
       begin
        swap(a[i], a[j]);
        inc(ans);
        break;
       end;
   for i := 1 to n do
    if a[i] <> b[i] then
     for j := f[a[i]].op to f[a[i]].ed do
      for  k := f[6-a[i]-b[i]].op to f[6-a[i]-b[i]].ed do
       if (a[i] = b[j]) and (a[j] = b[k]) and (a[k] = b[i]) then
        begin
         a[i] := b[i]; a[j] := b[j]; a[k] := b[k];
         inc(ans, 2);
        end;
  end;
Procedure print;
  begin
   assign(output, outf); rewrite(output);
   writeln(ans);
   close(output);
  end;
begin
  init;
  work;
  print;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: