NOIP2013提高組 火柴排隊

2022-06-03 05:03:09 字數 1061 閱讀 3359

σ(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 個火柴的高度。每列火柴中相鄰兩根火柴...