- 给你个复仇者联盟能量值。
- 你可以进行如下操作
- ①删去一个数
- ②给任意值+1,但是每个数最多可以加k次
注意::特判n==1的情况,wa*3
#include<bits/stdc++.h>
using namespace std;
long long a[200060];
long long sum[200060];
long long n,k,m,s=0;
char ch[]={'a','e','i','o','u'};
double count(int x,int y)
{
if((n-x)*k>=y)
return 1.0*(s-sum[x]+y)/(n-x);
else
return 1.0*(s-sum[x]+((n-x)*k))/(n-x);
}
int main()
{
cin>>n>>k>>m;
for(int i=0;i<n;i++)
{
cin>>a[i];
s+=a[i];
}
sort(a,a+n);
if(n==1)
{
double ans=s+min(m,k);
cout<<fixed<<setprecision(16)<<ans<<endl;
return 0;
}
for(int i=1;i<=n;i++)
{
sum[i]=sum[i-1]+a[i-1];
}
double ans=0;
/*if(n<=m)
{
for(int i=1;i<=n-1;i++)
{
int x=i,y=m-i;//shan x,jia y;
double t=count(x,y);
if(ans<t) ans=t;
}
}else
{
for(int i=1;i<=m;i++)
{
int x=i,y=m-i;//shan x,jia y;
double t=count(x,y);
if(ans<t) ans=t;
}
}*/
for(int i=min(n,m);i>=1;i--)
// for(int i=1;i<=n-1;i++)
{
if(i==n) continue;
int x=i,y=m-i;//shan x,jia y;
double t=count(x,y);
if(ans<t) ans=t;
//else break;
}
cout<<fixed<<setprecision(16)<<ans<<endl;
return 0;
}