NOIP2013提高組 火柴排隊

2021-07-15 23:51:20 字數 957 閱讀 8744

題目大意:給你兩個有序陣列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最大。

而根據排序不等式原理,∑aibi最大值是ai,bi的順序和。

所以先把ai按照高度排好序,bi也按照高度排好序。題目所求就是排好序的ai和bi編號要求1~6一一對應時的排序次數。

用乙個陣列記錄ai,bi編號間的對應關係,再求逆序對個數即可。

#include#include#include#include#include#include#define mo 99999997

#define maxn 100010

using namespace std;

typedef long long ll;

int n;

struct data

a[maxn],b[maxn];

bool cmp(data a,data b)

else

}while(i<=m)t[k++]=a[i++];

while(j<=y)t[k++]=a[j++];

for(int i=x;i<=y;i++)

a[i]=t[i];

return (t1+t2+t3)%mo;

}int main()

for(int i=1;i<=n;i++)

sort(a+1,a+n+1,cmp);

sort(b+1,b+n+1,cmp);

for(int i=1;i<=n;i++)

x[a[i].id]=b[i].id;

ll ans=merge_sort(1,n,x);

cout<

NOIP2013提高組 火柴排隊

noip2013 提高組 day1 試題 涵涵有兩盒火柴,每盒裝有 n 根火柴,每根火柴都有乙個高度。現在將每盒中的火柴各自排成一列,同一列火柴的高度互不相同,兩列火柴之間的距離定義為 其中 ai 表示第一列火柴中第 i個火柴的高度,bi 表示第二列火柴中第 i 個火柴的高度。每列火柴中相鄰兩根火柴...

NOIP2013提高組 火柴排隊

ai bi 2 ai2 bi2 2 ai bi,要使 ai bi 2最小,則需2 ai bi最大。由排序不等式可知兩列數字裡第一大與第一大對應,第二大與第二大對應,第k大與第k大對應,第n大與第n大對應時,ai bi最大。故先將第一列每個數字對映到第二列排名相同的數字,再求需要交換的次數,也就是逆序...

NOIp 2013 提高組 火柴排隊 題解

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