读书人

POJ 1804(最小邻近数移动)

发布时间: 2012-09-08 10:48:07 作者: rapoo

POJ 1804(最小相邻数移动)

题目大意:对乱序列相邻2数移动,使得用最小步数使其有序

解法:归并排序

定理:

一个乱序序列的逆序数 = 在只允许相邻两个元素交换的条件下,得到有序序列的交换次数

Program P1804;const   maxn=1000;Var   tt,i,j,k,n,ans:longint;   a,le,re:array[1..maxn] of longint;procedure mergesort(l,r:longint);var   i,j,k,mid:longint;begin   if l=r then exit;   mid:=(l+r) shr 1;   mergesort(l,mid);   mergesort(mid+1,r);   for i:=l to mid do le[i-l+1]:=a[i];   le[mid+2-l]:=maxlongint;   for i:=mid+1 to r do re[i-mid]:=a[i];   re[r+1-mid]:=maxlongint;   i:=1;j:=1;   for k:=l to r do   begin      if (le[i]<=re[j]) then      begin         a[k]:=le[i];         inc(i);      end      else      begin         a[k]:=re[j];         inc(j);         inc(ans,mid-l+1-(i-1));      end;   end;end;Begin   readln(tt);   for k:=1 to tt do   begin      writeln('Scenario #',k,':');      read(n);      for i:=1 to n do read(a[i]);      ans:=0;      mergesort(1,n);      writeln(ans);      writeln;   end;end.


读书人网 >编程

热点推荐