usaco 2.1 sort3 2008.5.20

usaco 2.1 sort3 2008.5.20

{

ID:

PROG: sort3

LANG: PASCAL

}

program p_sort3;

constmaxn=1000;fin='sort3.in';fout='sort3.out';

type

 arr1=array[1..maxn]of integer;

var

  a,g:arr1;n,i,j,sum:longint;

 p:array[1..3]of longint;

 e:array[1..3,1..2]of longint;

 f:array[1..maxn]of boolean;

 f1,f2:text;

procedure init;

  vari:longint;

 begin

   assign(f1,fin);reset(f1);

   assign(f2,fout);rewrite(f2);

   fillchar(p,sizeof(p),0);

   fillchar(f,sizeof(f),true);

   read(f1,n);

   for i:=1 to n do begin read(f1,a[i]);inc(p[a[i]]);end;

   e[1,1]:=1;e[1,2]:=p[1];

   e[2,1]:=p[1]+1;e[2,2]:=p[1]+p[2];

   e[3,1]:=p[1]+p[2]+1;e[3,2]:=n;

   for i:=1 to p[1] do g[i]:=1;

   for i:=e[2,1] to e[2,2] do g[i]:=2;

   for i:=e[3,1] to e[3,2] do g[i]:=3;

   sum:=0;

 end;

 procedure swap(var p1,p2:integer);

 varx:integer;

 begin x:=p1;p1:=p2;p2:=x;end;

 procedure doit;

 vari,ee:longint;

 begin

  for i:=1 to n do

    if a[i]=g[i] then f[i]:=false

      else

        begin

          inc(sum);j:=e[a[i],1]-1;

          repeat inc(j);

          until (((a[j]=g[i])and(f[j]))or(e[a[i],2]=j));

          if g[i]=a[j] then

            begin swap(a[i],a[j]);f[j]:=false;f[i]:=false;end

               else

                 begin

                   ee:=yy-a[i]-g[i];j:=e[ee,1]-1;

                    repeat inc(j);

                    until (a[j]=g[i])and(f[j]);

                    swap(a[i],a[j]);

                    f[i]:=false;

                 end;

     end;

 end;

 {-----------------------------}

 begin

  yy:=6;

  init;

  doit;

  writeln(f2,sum);

  close(f1);close(f2)

  end.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值