1. 程式人生 > >EOJ(排序)——15. Mr. Frog and big news

EOJ(排序)——15. Mr. Frog and big news

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; }