分治演算法_
求逆序對
ayyzoj p1434
【問題描述】
給定乙個序列a1,a2,…,an,如果存在iaj,那麼我們稱之為逆序對,求逆序對的數目。
【輸入格式】
第一行為n,表示序列長度,接下來的n行,第i+1行表示序列中的第i個數。
【輸出格式】
所有逆序對總數。
【輸入樣例】43
232【輸出樣例】
3【資料範圍】
n<=10^5,ai<=10^5。
思路:與歸併排序聯絡起來。
分析:歸併排序是將序列a[1,h]分成兩部分——a[1,mid]和a[mid+1,h]分別進行歸併排序,然後將這兩部分合併起來。
在合併的過程中(設1<=i<=mid,mid+1<=j<=h),
當a[i]<=a[j]時,並不產生逆序對;
當a[i]>a[j]時,在前半部分a[1,mid]中,比a[i]大的數都比a[j]大,將a[j]放在a[i]前面的話,逆序數要加上mid-i+1.(i..mid 共有mid-i+1個數)
因此,可以在歸併排序中的合併過程中計算逆序對的數量。
1排序演算法_var2 a,r:array[1..100000] of
longint;
3i,n:longint;ans:int64;
4procedure
mergesort(s,t:longint);
5var
6m,i,j,k:longint;
7begin
8if s=t then
exit;
9 m:=(s+t) div2;
10mergesort(s,m);
11 mergesort(m+1
,t);
12 i:=s;
13 j:=m+1
;14 k:=s;
15while (i<=m) and (j<=t) do
16if a[i]<=a[j] then
17begin r[k]:=a[i];inc(i);inc(k);end
18else
19begin
ans:=ans+m-i+1; r[k]:=a[j]; inc(j); inc(k);end;20
while i<=m do
begin r[k]:=a[i]; inc(i); inc(k);end;21
while j<=t do
begin r[k]:=a[j]; inc(j); inc(k);end;22
for i:=s to t do a[i]:=r[i];
23end;24
begin
25readln(n);
26for i:=1
to n do
readln(a[i]);
27 mergesort(1
,n);
28writeln(ans);
29end.
車廂重組
ayyzoj p1437
這題的描述讓人一眼覺得就是氣泡排序,老師說正解應該是歸併,可是資料太弱,冒泡就水過了。
1氣泡排序program
p1437;
2var
3n,i,j,t,k:longint;
4 a:array[1..10000] of
longint;
5flag:boolean;
6begin
7readln(n);
8for i:=1
to n do
read(a[i]);
9for j:=1
to n-1
do10
begin
11 flag:=true;
12for i:=1
to n-j do
13if a[i]>a[i+1] then
begin
14 t:=a[i];a[i]:=a[i+1];a[i+1]:=t; inc(k);
15 flag:=false; end;16
if flag then
break;
17end;18
write(k);
19end.
演算法練習 二
不知道為什麼網上找的關於acm的資料幾乎都是用pascal語言寫的,而我們學校要求是必須用c c 寫,我也知道語言只是工具,演算法才是核心,但我看到滿篇的pascal我還是沒有耐心研讀.如果大家有什麼好的關於下面暴露一下今天寫的 這兩道題還有比較有意思的.第一題 有什麼不好的地方,希望得到大家的批評...
C 排序演算法練習 快速排序
在所有的技藝中,武功是最強調內功的,比如同樣都學了辟邪劍譜,為什麼岳不群要比林平之厲害?武功的招式固然重要,但沒有深厚的內功,威力會大打折扣.那麼,內功是怎麼練出來的呢?冬練三九,夏練三伏,古人早有定論.而這些道理用在程式開發上也一樣適用.include using namespace std 演算...
C 演算法練習二
1.使用者輸入三個字串,用倒序輸出使用者輸入的字串 public void method console.readkey 2.使用者輸入乙個數字和乙個寬度,寬度也是乙個正整數,然後用第乙個數字列印出乙個直角等腰三角形 public void method int digit,int width co...