涵涵有兩盒火柴,每盒裝有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.網路規模 區域網常見的拓撲結構有星型 環型 匯流排型 網路型 樹型 混和型等。乙個網路協議主要由語法 語義 及同步等三要素組成。簡要說明 協議是水平的 ...