貪心之火柴排隊(NOIP2013)

2021-08-19 14:02:56 字數 2216 閱讀 8529

描述

涵涵有兩盒火柴,每盒裝有n 根火柴,每根火柴都有乙個高度。 現在將每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 兩列火柴之間的距離定義為: 

∑(ai-bi)^2

其中 ai 

表示第一列火柴中第 

i 個火柴的高度,

bi 表示第二列火柴中第 

i 個火柴的高度。每列火柴中相鄰兩根火柴的位置都可以交換,請你通過交換使得兩列火柴之間的距離最小。請問得到這個最小的距離,最少需要交換多少次?如果這個數字太大,請輸出這個最小交換次數對 

99,999,997 

取模的結果。

輸入共三行,第一行包含乙個整數 n,表示每盒中火柴的數目。

第二行有 n 個整數,每兩個整數之間用乙個空格隔開,表示第一列火柴的高度。

第三行有 n 個整數,每兩個整數之間用乙個空格隔開,表示第二列火柴的高度。

輸出輸出共一行,包含乙個整數,表示最少交換次數對 99,999,997 取模的結果。

樣例輸入

輸入輸出樣例1

42 3 1 4

3 2 1 4

輸入輸出樣例2

41 3 4 2

1 7 2 4

樣例輸出

輸入輸出樣例1

1輸入輸出樣例2

2

提示輸入輸出樣例說明1:

最小距離是 0,最少需要交換 1 次,比如:交換第 1 列的前 2 根火柴或者交換第 2 列的前 2 根火柴。

輸入輸出樣例說明2:

最小距離是 10,最少需要交換 2 次,比如:交換第 1 列的中間 2 根火柴的位置,再交換第 2 列中後 2 根火柴的位置。

資料範圍:

對於 10%的資料, 1 ≤ n ≤ 10;

對於 30%的資料,1 ≤ n ≤ 100;

對於 60%的資料,1 ≤ n ≤ 1,000;

對於 100%的資料,1 ≤ n ≤ 100,000,0 ≤火柴高度≤ maxlongint

解題思路

首先我們來分析一下這道題目的思路。假如我現在有兩列火柴,長度分別為1,2,3,4,5和6,7,8,9,10,我們如何使

∑(ai-bi)^2

,也就是每一對火柴長度之差

|ai-bi|

最小呢?是不是兩列中長度第一小的放在一起(

1,5),長度第二小的放在一起(

2,3),等等。

所以我想到了可以使用權值來表示火柴的長度:例如一列火柴:

6,8,2,7,3

,它們的權值大小分別為

3,5,1,4,2

,使用權值來表示這根火柴在這列火柴中的長度佔第幾位。選定一列火柴權值不動,移動另一列火柴的權值,最終把兩列火柴權值相同的火柴成對,這樣就能夠使每一對火柴長度之差

|ai-bi|

最小,也就是

∑(ai-bi)^2

最小。好,現在已知最小的

∑(ai-bi)^2

的火柴佇列是什麼樣的,但是題目要求計算出最少交換次數。其實呀,這裡說的最少交換次數就是逆序對數(這個自己要好好地思考一下,是不是有多少組逆序對,我們就要交換多少次,使它成為乙個有序佇列呢?)但是這裡的逆序對跟我們平常所學習的有所不同,這裡我們以固定的火柴列的權值為新的從小到大的排序規則,按照這個新的排序規則看看另一列中有多少組逆序對。

參考程式

#include#includeusing namespace std;

int n,x,y,flag,a1[100005],b1[100005];

struct p//定義乙個結構體

a[100005],b[100005];

long ans=0;//全域性變數逆序對數(即交換次數,要定義成long,要不然最後會爆)

int cmp(p a,p b)

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++)//給火柴賦權值

a[i].h=b[i].h=i;

sort(a+1,a+1+n,cmp1);//恢復火柴的初始長度

sort(b+1,b+1+n,cmp1);

for(int i=1;i<=n;i++)

msort(a1,1,n);

cout

}

NOIP2013 火柴排隊

題目 分析 a中第幾大一定對應b中第幾大。ab同時移動相當於a移動,相對位置不變。所以,用c i 表示a i 需要移動到的 位置,求其中的逆序對。因為乙個每移動相鄰兩個元素相當於消除乙個逆序對。include include using namespace std const int tmax 10...

NOIP 2013 火柴排隊

題目描述 description 涵涵有兩盒火柴,每盒裝有 n 根火柴,每根火柴都有乙個高度。現在將每盒中的火柴各自排成一列,同一列火柴的高度互不相同,兩列火柴之間的距離定義為 其中 ai表示第一列火柴中第 i 個火柴的高度,bi表示第二列火柴中第 i 個火柴的高度。每列火柴中相鄰兩根火柴的位置都可...

noip2013 火柴排隊

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