排序的幾種題型

2021-10-18 03:18:41 字數 2145 閱讀 2493

acwing 103. 電影(應用)

給定n個數,1,2,100000,1000000,3……,n不大,但是數很大。此時可以先對這些數排序,放到乙個陣列裡,這樣就建立了這些數與0,1,2……n的對映。之後用1,2……n來代替這些數,可以建立更方便的對映。如果這些數中有重複,需要去重,順便把數量記錄下來。因為已經排好序,所以可以使用二分查詢來搜尋100000對映的整數是0,1,2……n中的哪乙個。

sort

(a +

1, a + n +

1, cmp)

;for

(int i =

1; i <= n; i ++

)else

}

acwing 104. 貨倉選址(模板)

模板題

如果在計算的過程中,遇到類似:給定一些數a1, a2, …… an,求乙個整數k,

for

(int i =

1; i <= n ; i++

) res +

=abs

(a[i]

- k)

;

使res最小的時候,套用本題的模板即可。

無論n是奇數還是偶數,只要下標從1開始,直接讓k = a[n / 2 + 1]。

acwing 105. 七夕祭(應用)

本題可以模擬為行、列方向上的兩次「環形均分紙牌」問題。「環形紙牌」問題可以模擬為「均分紙牌」和「貨倉選址」問題。

106. 動態中位數(求中位數的一種方法)

用最大堆和最小堆,求出該問題。

求逆序對的方法:歸併排序

void

merge

(int l,

int mid,

int r,

int p)

for(

int k = l; k <= r; k ++

) p[k]

= temp[k]

;}

cnt就是逆序對個數。

從我做的兩道題來看,逆序對問題往往與「交換」有關。交換過程也就是逆序對的變化過程

acwing 107. 超快速排序

題目出現的特徵:

該演算法通過交換兩個相鄰的序列元素來處理n個不同整數的序列,直到序列按公升序排序。

注意「交換」這兩個字。每次交換,序列逆序對的個數都會減一。最後公升序的時候,逆序對個數為0。因此交換次數等於逆序對個數。

acwing 108. 奇數碼問題

題目出現的特徵

可以把空格與其上、下、左、右四個方向之一的數字交換(如果存在)。

題目雖然是二維,但是可以看成將空格去除的一維序列。

觀察到,從乙個圖變為另乙個圖,每次交換,要麼逆序對個數不變,要麼逆序對個數減二。換言之,逆序對的奇偶性始終不變。

那麼兩個圖的逆序對奇偶性相同,是不是兩個圖就是相互可達呢?lyd說證明過程過為複雜,不予證明。總而言之是可以證明的。不過競賽的時候估計沒時間證明。有些題明明不會,卻能夠ac,這也是程式設計競賽的樂趣之一吧(狗頭)排序

氣泡排序的逆序對題。如果要讓長度最短,那麼就需要讓它的逆序對個數盡可能的多。對於乙個長度為n的字串,其逆序對的最大個數為n * (n - 1) / 2。當n等於15時,逆序對個數為105,與100最相近。此時我們讓其逆序對個數再減少5即可。

幾種典型的搜尋題型(一)

搜尋題型很多.但身為菜鳥的我,僅僅只能挑出一些常見的簡單題型來講解一番了。因為不懂什麼專業的術語,下面題型都是我自己命名,請不要見怪哦。一 合併周邊同類問題基礎版 oil deposits 題意 有一塊空地,代表油田,不是油田。然後若是兩個油田橫豎斜三個方向中有乙個方向是相連線的那麼把這兩個油田看做...

成績排序(3種題型) C

輸入任意 使用者,成績 序列,可以獲得成績從高到低或從低到高的排列,相同成績 都按先錄入排列在前的規則處理。輸入多行,先輸入要排序的人的個數,然後輸入排序方法0 降序 或者1 公升序 再分別輸入他們的名字和成績,以乙個空格隔開 按照指定方式輸出名字和成績,名字和成績之間以乙個空格隔開 include...

mysql 幾種排序 MySql的幾種排序方式

資料排序的情況很常見,今天介紹一下mysql的幾種排序方式,是我最近有使用到的,希望能對大家有所幫助。這裡先建立一張普通的表,create table test1 id bigint 20 not null auto increment,name varchar 50 not null,date t...