zoukankan      html  css  js  c++  java
  • Codeforces 1106C Lunar New Year and Number DivisionLunar |数学

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

    思路:

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

    证明

    A.两两配对更优

    因为假设两个数组合起来((a+b)^2=a^2+2ab+b^2),相比于$ a2+b2$,只会多了个(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;
    }
    
    
  • 相关阅读:
    多态与鸭子类型
    mixin与派生
    4.9作业
    property
    继承
    封装
    《梦断代码》阅读笔记1
    阅读笔记3——《大道至简》第四、五、六章
    阅读笔记2——《大道至简》第二、三章
    阅读笔记1——《大道至简》第一章
  • 原文地址:https://www.cnblogs.com/fmj123/p/CF1106C.html
Copyright © 2011-2022 走看看