题意:给出 n 个数 a[1],a[2]...a[n] ,现在有至多 m 次操作,每次操作有两种选择:
①:去掉数组中的一个数 ;
②:给数组中的一个数加上 1,对同一个数至多加 k ;
求最后剩下的所有数的最大平均值。
分析:显然已经,在最优解的步骤中,如果一共删除了cnt 个数(cnt<=m),为了最大化平均值,那么肯定是删除最小的 cnt 个数。剩下的 (m-k) 次操作就尽量做第二个操作(因为对没删除的每个数最多进行k 次操作,可能做不到 m-k 次)
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1E5+10;
int n,k,m;
int a[N];
double sum=0;
int main()
{
scanf("%d%d%d",&n,&k,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]),sum+=1.0*a[i];
sort(a+1,a+n+1);
double ans=(1.0*sum+min(1.0*n*k,1.0*m))/(1.0*n);
for(int i=1;i<=min(n,m);i++)
{
sum-=a[i]; //当前已经删掉了 i 个最小的数
double res=(1.0*sum+min(1.0*(n-i)*k,1.0*m-i))/(1.0*n-i);
ans=max(ans,res);
}
printf("%lf",ans);
return 0;
}