题解CF1106C

本题应该降橙

CF1106C题目传送门


题意简述

给你  n \ n\ 个数,求这些数分组后平方和的最小值。

一组至少要有  2 \ 2\ 个数。

题目保证  n \ n\ 是偶数。

思路

这个问题我们需要证明一个点:

11:一个排好序后的数组,分组后平方和的最小值一定是让  ai \ a_i\  ani+1 \ a_{n-i+1}\ 相加。

众所周知,在  a>b \ a>b\ 的情况下,  a2>b2\ a^2>b^2

所以我们让  i,j     i+j \ \forall i,j\ \ \ \ \ i+j\ 尽可能的小?

不是的。

因为一个  1,2,45,99 \ 1,2,45,99\ 的数组,按这种方式答案是  20735\ 20735

然而,实际的解是  12209\ 12209

所以,我们让  i,j     i+j \ \forall i,j\ \ \ \ \ i+j\ 尽可能平均。

为什么要平均呢?

看这个例子就知道了:

472+472=4418   482+462=442047^2+47^2=4418\ \ \ 48^2+46^2=4420

再到  (49,45) \ (49,45)\ 就不用说了,肯定更大。

所以,分成任意组,极差越大,答案越大。

而我们求的是最小,所以我们应该让它平均分。

而为了平均分,我们需要使用时间复杂度为  O(nlogn) \ \operatorname{O}(n \log n)\  sort \ \operatorname{sort}\ 排序。

当然,手打快排,归并等时间复杂度为  O(nlogn) \ \operatorname{O}(n \log n)\ 的排序也没有问题,但不能用  O(n2) \ \operatorname{O}(n^2)\ 的排序,因为会  TLE\ \text{TLE}

最后,还有  O(n) \ \text{O}(n)\ 的桶排序代码,可以过 10710^7

(正常  sort \ \text{sort}\ 能过本题  3×105\ 3×10^5,但过不了  107\ 10^7

ctjer 最喜欢的代码环节

AC Code 1:O(nlogn)\text{O}(n\log n)

#include<iostream>
#include<algorithm>
using namespace std;
int a[300001],n;
long long ans;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	sort(a+1,a+n+1);
	for(int i=1;i<=n/2;i++){
		ans+=(a[i]+a[n-i+1])*(a[i]+a[n-i+1]);
	}
	cout<<ans;
	return 0;
}

AC Code 2:O(n)\text{O}(n)

#include<iostream>
#include<algorithm>
using namespace std;
int a[300001],x,n,b[10001],p;
long long ans;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>x;
       	b[x]++;
	}
	for(int i=1;i<=10000;i++){
        for(int j=1;j<=b[i];j++){
            a[++p]=i;
        }
    }
    for(int i=1;i<=p/2;i++){
    	ans+=(a[i]+a[n-i+1])*(a[i]+a[n-i+1]);
	}
	cout<<ans;
	return 0;
}

感谢各位在评论区  hack \ hack\ 的大佬们~

posted @   Weslie_qwq  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示