其他分享
首页 > 其他分享> > CF1557A题解

CF1557A题解

作者:互联网

思路1:

这道题其实可以用前缀和做的,对于每一次输入,可以先将数组 \(a\) 排序,然后利用前缀和对于每一个 \(x (1 \le x\le n)\) 算出 \(\sum\limits_{j=1}^{x}{a_j}\) ,然后算平均数,求出最大即可。

核心代码

#define int long long
int a[(int)1e5+10]={0},f[(int)1e5+10]={0};
int n;
for(int i=0;i<n;i++){
	cin>>a[i];
}
sort(a,a+n);
for(int i=0;i<n;i++){if(i==0){f[i]=a[i];}
	else f[i]=f[i-1]+a[i];
}
double mx=-(int)(2e9);
for(int i=0;i<n-1;i++){
double mx2=(double)f[i]/(double)(i+1) + (double)(f[n-1]-f[i])/(double)(n-i-1);
 mx=max(mx,mx2);


时间复杂度:\(\mathcal O(n)\)

思路2:

其实,观察样例,我们发现最优解一定是把最大的放在一组,其他的放在另一组。

核心代码

cout<<fixed<<setprecision<<((double)(mx))+((double)(sm-mx)/(double)(n-1))

证明:

设 \(x=a\)数组中最大的,数组 \(b\) 是数组 \(a\) 中其他的元素构成的数组。数组 \(c\) 是数组 \(b\) 中某些的元素构成的数组。数组 d$ 是数组 \(b\) 中剩下的元素构成的数组。

\(\because \frac {x + \sum\limits_{i=1}^{len(c)}c_i }{len(c)+1} + \bar{d} \le \bar{b} + x\)

\(\therefore\) 最优解一定是把最大的放在一组,其他的放在另一组。

时间复杂度:\(\mathcal O(1)\)

提醒

标签:le,int,题解,复杂度,long,1e5,数组,CF1557A
来源: https://www.cnblogs.com/Wildcxj/p/15125388.html