描述
涵涵有兩盒火柴,每盒裝有n 根火柴,每根火柴都有乙個高度。 現在將每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 兩列火柴之間的距離定義為:
∑(ai-bi)^2
其中 ai
表示第一列火柴中第
i 個火柴的高度,
bi 表示第二列火柴中第
i 個火柴的高度。每列火柴中相鄰兩根火柴的位置都可以交換,請你通過交換使得兩列火柴之間的距離最小。請問得到這個最小的距離,最少需要交換多少次?如果這個數字太大,請輸出這個最小交換次數對
99,999,997
取模的結果。
輸入共三行,第一行包含乙個整數 n,表示每盒中火柴的數目。
第二行有 n 個整數,每兩個整數之間用乙個空格隔開,表示第一列火柴的高度。
第三行有 n 個整數,每兩個整數之間用乙個空格隔開,表示第二列火柴的高度。
輸出輸出共一行,包含乙個整數,表示最少交換次數對 99,999,997 取模的結果。
樣例輸入
輸入輸出樣例142 3 1 4
3 2 1 4
輸入輸出樣例2
41 3 4 2
1 7 2 4
樣例輸出
輸入輸出樣例11輸入輸出樣例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 個火柴的高度。每列火柴中相鄰兩根火柴的位置都可以交換,請你通...