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

Posted fmj123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 1106C Lunar New Year and Number DivisionLunar |数学相关的知识,希望对你有一定的参考价值。

题意:给定一个(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-bcge0)

(ac+bd-ad-bc)

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

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

$ ecause c<d$

( herefore (b-a)c <(b-a)d)

( herefore -(b-a)c +(b-a)d >0)

( herefore 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 |数学的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #536 (Div. 2) B. Lunar New Year and Food Ordering

Lunar New Year and Red Envelopes CodeForces - 1106E (dp)

Codeforces 536F Lunar New Year and a Recursive Sequence | BSGS/exgcd/矩阵乘法

Codeforces Round #536 E. Lunar New Year and Red Envelopes /// 贪心 记忆化搜索 multiset取最大项

Codeforces 1106F Lunar New Year and a Recursive Sequence (数学线性代数线性递推数论BSGS扩展欧几里得算法)

Codeforces 126B. Password(KMP,DP)