P1966 火柴排隊

2022-08-26 08:00:10 字數 1711 閱讀 7207

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

其中ai​ 表示第一列火柴中第 i個火柴的高度,bi​表示第二列火柴中第 i 個火柴的高度。

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

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

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

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

乙個整數,表示最少交換次數對 99,999,997 取模的結果。

輸入 #1

4

2 3 1 4

3 2 1 4

輸出 #1

1
輸入 #2

4

1 3 4 2

1 7 2 4

輸出 #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

本蒟蒻犯了兩個「令人髮指」的錯誤:

·n和mod值賦反了

·cmp函式裡return沒打。。。

**:

#include#include#include#include#includeusing namespace std;

const int n=100010;

const int mod=99999997;

long long ans;

int n,c[n],d[n];

struct no a[n],b[n];

bool cmp(no a,no b)

void solve(int l,int r)

while(i<=mid)

d[k++]=c[i++];

while(j<=r)

d[k++]=c[j++];

for(i=l; i<=r; i++)

c[i]=d[i];

}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++)

c[b[i].num]=a[i].num;

solve(1,n);

printf("%lld\n",ans);

return 0;

}

P1966 火柴排隊

題意 求兩個為n的序列貢獻值最小需要怎麼移動才能達到,移動 交換相鄰元素,貢獻值 ai bi 2。顯然可以猜出來,排序過後對應的最小。事實上也可以用反證法證明aac bd最小 我們令上面的序列不動,只動下面的序列,首先得到下面序列應該是怎麼樣的。用標號來標誌原來位置,排序過後,把對應位置賦值到陣列上...

P1966 火柴排隊

讓a,b序列中大小排名相對應即可 若a中第j大的位於i,則應該b中第j大位於i 證明 假如a1則排列方式有 a1,a2,b1,b2或 a1,a2,b2,b1那麼 對於這兩種情況上,平方並做差,即可得以上結論 然而大問題是這樣離散化後怎麼搞出交換幾次呢 離散化後 c b i 然後若我們最後拍完序 定然...

P1966 火柴排隊

題目描述 涵涵有兩盒火柴,每盒裝有 nn 根火柴,每根火柴都有乙個高度。現在將每盒中的火柴各自排成一列,同一列火柴的高度互不相同,兩列火柴之間的距離定義為 sum a i b i 2 a i b i 2 其中 a i 表示第一列火柴中第 i 個火柴的高度,b i 表示第二列火柴中第 i 個火柴的高度...