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)\)
提醒
- 测试点2错误:要开
long long
!!!!!!!(考场上没加,呜呜~┭┮﹏┭┮) - 其他:数组开小了或者爆空间
标签:le,int,题解,复杂度,long,1e5,数组,CF1557A 来源: https://www.cnblogs.com/Wildcxj/p/15125388.html