σ(ai-bi)2=σai2+σbi2-2σai*bi,要使σ(ai-bi)2最小,則需2σai*bi最大。
由排序不等式可知兩列數字裡第一大與第一大對應,第二大與第二大對應,……,第k大與第k大對應,……,第n大與第n大對應時,σai*bi最大。
故先將第一列每個數字對映到第二列排名相同的數字,再求需要交換的次數,也就是逆序對的個數。
#include #include#include
#define maxn 100005typedef
long
long
llint;
using
namespace
std;
intn;
llint tmp[maxn], sorted[maxn], cnt = 0
;void merge_sort(int l, int
r) }
while (p1 <=mid)
tmp[p++] = sorted[p1++];
while (p2 <=r)
tmp[p++] = sorted[p2++];
for (int i = l; i <= r; i++)
sorted[i] =tmp[i];
}template
void print(t *p)
pair
a[maxn], b[maxn];
intrnk[maxn];
intmain()
for (int i = 1; i <= n; i++)
sort(a + 1, a + n + 1
); sort(b + 1, b + n + 1
);
for (int i = 1; i <= n; i++)
sorted[a[i].second] = b[i].second; //
將第一列排第i名的項與第二列排第i名的項對應
merge_sort(1
, n);
cout
<< cnt
}
NOIP2013提高組 火柴排隊
題目大意 給你兩個有序陣列a,b並定義a,b間的距離為 ai bi 2,要求交換a或者b中的某些元素的位置使得a,b間距離最小。由於 ai bi 2 ai 2 bi 2 2 aibi 而由於題目給定了ai,bi的值,所以 ai 2 bi 2 是定值,要求原式最小就需要 aibi最大。而根據排序不等式...
NOIP2013提高組 火柴排隊
noip2013 提高組 day1 試題 涵涵有兩盒火柴,每盒裝有 n 根火柴,每根火柴都有乙個高度。現在將每盒中的火柴各自排成一列,同一列火柴的高度互不相同,兩列火柴之間的距離定義為 其中 ai 表示第一列火柴中第 i個火柴的高度,bi 表示第二列火柴中第 i 個火柴的高度。每列火柴中相鄰兩根火柴...
NOIp 2013 提高組 火柴排隊 題解
問題描述 涵涵有兩盒火柴,每盒裝有 n 根火柴,每根火柴都有乙個高度。現在將每盒中的火柴各自 排成一列,同一列火柴的高度互不相同,兩列火柴之間的距離定義為 i 1n ai b i 2 其中 ai 表示第一列火柴中第 i 個火柴的高度,bi 表示第二列火柴中第 i 個火柴的高度。每列火柴中相鄰兩根火柴...