複習題解集 火柴排隊

2021-10-08 00:02:54 字數 1572 閱讀 5303

涵涵有兩盒火柴,每盒裝有n 根火柴,每根火柴都有乙個高度。 現在將每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 兩列火柴之間的距離定義為: ∑(ai-bi)^2其中 ai 表示第一列火柴中第 i 個火柴的高度,bi 表示第二列火柴中第 i 個火柴的高度。每列火柴中相鄰兩根火柴的位置都可以交換,請你通過交換使得兩列火柴之間的距離最小。

請問得到這個最小的距離,最少需要交換多少次?如果這個數字太大,請輸出這個最小交換次數對 99,999,997 取模的結果。

42 3 1 4

3 2 1 4

我們不難發現其實若要最後距離最短其實就是|ai-bi|最小,所以為了達到這種效果只需讓最大和最大作差,次大和次大依次作差,所以首先排序(要儲存原位置下標),然後再將a陣列的所有火柴在b陣列中找到對應,最後最在陣列裡,求陣列的逆序對即可(因為此事陣列最大和最大,次大和次大應該一一對應,若出現有a[i] > a[j] && i < j的情況就需要轉換,即使操作++)

最後求逆序對可以用二路歸併排序,記錄操作次數

#include 

#include

#include

using namespace std;

long long n, sum[

1000005

], c[

1000005

], ans;

void

er_sort

(long long qi, long long len)

int mid =

(qi + len)/2

;er_sort

(qi, mid)

;er_sort

(mid +

1, len)

; long long i = qi;

long long j = mid +1;

long long k = qi;

while

(i <= mid && j <= len)

else

}while

(i <= mid)

while

(j <= len)

for(int i = qi; i <= len;i ++)}

struct jja[

100005

], b[

100005];

int cmp

(jj x, jj y)

int main()

for(int i =

1;i <= n; i++

)sort

(a +

1, a +

1+ n, cmp)

;sort

(b +

1, b +

1+ n, cmp)

;for

(int i =

1;i <= n; i++

)er_sort(1

, n)

;printf

("%lld"

, ans %

99999997);

return0;

}

複習題之Blah數集

題目描述 大數學家高斯小時候偶然間發現一種有趣的自然數集合blah,對於已a為基的集合ba定義如下 1 a是集合ba的基,且a是ba的第乙個元素 2 如果x在集合ba中,則2x 1,3x 1也都在集合ba中 3 沒有其他元素在集合ba中了。現在小高斯想知道如果將集合ba中的元素按照公升序排列,第n個...

檔案複習題

1.把乙個數字的list從小到大排序,然後寫入檔案,然後從檔案中讀取出來檔案內容,然後反序,在追加到檔案的下一行中 首先 將list 排序,其次寫入檔案 l 10,8 3,2 6,0 1,9 5,4 l1 sorted l f codecs.open 2.txt wb f.write str l1 ...

網路複習題

廣域網的英文縮寫為 b a.lan b.wan c.pan d.man 下列不屬於計算機網路效能指標的是 d a.rtt b.頻寬 c.吞吐率 d.網路規模 區域網常見的拓撲結構有星型 環型 匯流排型 網路型 樹型 混和型等。乙個網路協議主要由語法 語義 及同步等三要素組成。簡要說明 協議是水平的 ...