码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces 1106C Lunar New Year and Number DivisionLunar |数学

时间:2019-02-01 14:12:36      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:space   its   ORC   一个   number   return   假设   lun   ace   

题意:给定一个\(n\)个数的序列(\(n\)为偶数) 。将数列组合为若干组。每组的数的个数至少为2。
求每一组数的和平方后,所有组之和的最小值。

思路:

排序后,第\(i\)小与第\(i\)大两两配对就行了。

证明

A.两两配对更优

因为假设两个数组合起来\((a+b)^2=a^2+2ab+b^2\),相比于$ a^2+b^2$,只会多了个\(2ab\)的项

如果是三个数组合起来,那么是\((a+b+c)^2 =a^2+b^2+c^2+2ab+2ac+2bc\),会多3个类似\(2ab\)的项。以此类推。

题目已经说明所有数均大于0,显然我们无法在\(a^2\)这种项下功夫,所以只要类似\(2ab\)的项越少,答案就越小。

假设两两组合,所得的这种\(2ab\)的项是最少的。

Q.E.D

B.小的与大的配对更优

假设\(a<b<c<d\),则问题转化为证明\(ac+bd - ad-bc\ge0\)

\(ac+bd-ad-bc\)

\(=(a-b)c + (b-a)d\)

\(= -(b-a)c + (b-a) d\)

$ \because c<d$

\(\therefore (b-a)c <(b-a)d\)

\(\therefore -(b-a)c +(b-a)d >0\)

\(\therefore ac+bd-ad-bc>0\)

Q.E.D.

#include<bits/stdc++.h>
using namespace std;
long long n,a[300100],ans;
int main()
{
    cin>>n;
    for (int i=1;i<=n;i++)
      cin>>a[i];
    sort(a+1,a+1+n);
    for (int i=1;i<=n/2;i++)
    {
        ans+=(a[i]+a[n-i+1])*(a[i]+a[n-i+1]);
    }
    cout<<ans<<endl;
    return 0;
}

Codeforces 1106C Lunar New Year and Number DivisionLunar |数学

标签:space   its   ORC   一个   number   return   假设   lun   ace   

原文地址:https://www.cnblogs.com/fmj123/p/CF1106C.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!