EOJ(排序)——15. Mr. Frog and big news
阿新 • • 發佈:2019-01-11
15. Mr. Frog and big news
作為一名資深記者,青蛙先生非常討厭時不時蹦出來的大新聞。
偏偏最近大新聞還特別多。青蛙先生覺得應該做一點小小的貢獻,把新聞的「雨聲」儘可能地變得「小」一點。青蛙先生手上有 N 條國內新聞和 N 條國外新聞。這 N 條國內新聞的大小為 a1,a2…aN,N 條國外新聞的大小為 b1,b2…bN。他決定每天報道任意一條沒有報道過的國內新聞和國外新聞。由於青蛙先生已經提前掌握了這 N 天的新聞,青蛙先生可以自己決定報道這些新聞的順序。
某一天的新聞的大小由當天報道的國內新聞的大小 ai 和國外新聞 bi 決定。令 ci=(ai+bi)2,N 天新聞的大小是由 ∑i=1Nci 決定的。青蛙先生希望這個值最小化。
簡單地說,就是給定兩個數列 a1,a2…aN,b1,b2…bN,求 1 到 N 的兩個全排列 s1,s2…sN,t1,t2…tN,使得 ∑i=1N(asi+bti)2 最小化。
輸入
不超過 20 組資料,每組資料三行。
第一行是一個整數表示 N (1≤N≤2×105)。
第二行是 N 個整數,分別為 a1,a2…aN (−105≤ai≤105)。
第三行是 N 個整數,分別為 b1,b2…bN (−105≤bi≤105)。
處理到檔案結束。
輸出
每行一個最小值。
input
3
1 3 2
-3 1 2
5
0 0 3 1 2
3 1 0 0 0
6
-1 -1 0 1 2 3
3 3 6 7 0 0
output
18
24
99
題目大意:
每組給出兩個陣列A[n],B[n],需要求A,B的排列,求每一項(A[i]+B[i])^2之和取得的最小值。
題目解析:
將A,B都按順序排列,使A[i]依次與B[n-i-1]湊成一對。
具體程式碼:
#include<iostream>
#include<algorithm>
using namespace std;
long long A[200010],B[200010];
int main()
{
int n;
while(cin>>n){
long long sum=0;
for(int i=0;i<n;i++)
cin>>A[i];
for(int i=0;i<n;i++)
cin>> B[i];
sort(A,A+n);
sort(B,B+n);
for(int i=0;i<n;i++){
sum+=(A[i]+B[n-i-1])*(A[i]+B[n-i-1]);
}
cout<<sum<<endl;
}
return 0;
}