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