題目大意:給你兩個有序陣列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 個火柴的高度。每列火柴中相鄰兩根火柴...