首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

POJ 1804(最小邻近数移动)

2012-09-08 
POJ 1804(最小相邻数移动)题目大意:对乱序列相邻2数移动,使得用最小步数使其有序解法:归并排序定理:一个乱

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.


热点排行