每个超级英雄都被幸福委员会赋予了力量价值。复仇者联盟的工作人员希望通过执行特定的操作来最大化团队中超级英雄的平均力量。
最初复仇者联盟中有n个超级英雄,分别拥有a1,a2,…,an的异能。在一次操作中,他们可以从团队中移除一个超级英雄(如果团队中至少有两个超级英雄的话),或者他们可以增加超级英雄1的力量。它们最多只能做m个运算。而且,对于一个超级英雄最多可以做k个操作。
你能帮助复仇者团队最大化团队成员的平均力量吗?
输入
第一行包含三个整数n,k和m(1≤n≤105,1 k≤≤105,1≤≤107)——超级英雄的数量,最大数量的时候你可以增加一个特定的超级英雄的力量,和总最大操作数。
第二行包含n个整数a1,a2,…,一个ai(1≤≤106)——初始力量的超级英雄的复仇者。
输出
输出单个数字——最终的最大平均功率。
你的答案是正确的如果它的绝对或相对误差不超过10−6。
正式,让你的回答是,陪审团的答案是b。你的答案是接受当且仅当|−b |马克斯(1 b | |)≤10−6。
Examples
Input
2 4 6 4 7
Output
11.00000000000000000000
Input
4 2 6 1 3 2 3
Output
5.00000000000000000000
请注意
在第一个示例中,通过删除第一个元素并将第二个元素增加四倍,可以获得最大平均值。
代码:
#include<bits/stdc++.h>
using namespace std;
int i,i0,n,m,k;
int a[100005];
int main()
{
scanf("%d %d %d",&n,&k,&m);
double sum=0;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i])
sum+=a[i];
}
sort(a+1,a+1+n);
double ans=(sum+min(n*k,m))/n;
for(i=1;i<n;i++)
{
int op=m-i;
sum-=a[i];
if(op<0)
break;
ans=max(ans,(sum+min(((double)(n-i)*k),(double)op))/(n-i));
}
printf("%.12f\n",ans);
return 0;
}
在第二个示例中,实现最大平均值的方法之一是删除第一个和第三个元素,并将第二个和第四个元素分别增加2。
这道题目的解法很是新颖,是从小到大排序,遍历数据,从小的数据开始删除(当然会有限制条件,不能删的太多),然后计算删除当前数据后的平均值,记录下来,再去删掉下一个,再计算一下平均值,每次取平均值的最大值,最后输出最大的平均值。下面看看这个最大值怎么处理的。
代码的思路是将两种操作分开(毕竟两种操作喝起来有些复杂),我们可以一遍遍的逐个删除,在删除一个的时候算一下此时的平均值,取一下max值,再进行下一个数据的删除。就这样一步步的删除取最大的平均值,直到最后一个的时候,最后一个不能删除。
接下来看看具体的操作:ans=(sum+min(n*k,m))/n; 我们定义n 为数据的数量,k为每个数据最多加的数量,m为总操作数,因为我们将删除和进行加上1 操作分开,我们取平均值的时候,就只考虑做多能加多少,n*k是目前所有的数据(因为会删除数据的)最多加的,与所给的总操作数进行比较,然后算一下现在的平均值。在删除数据之后(相应的总和也会相应减少),也会算一下此时的平均值 (sum+min(((double)(n-i)*k),(double)op))/(n-i) ,最后取一下max 函数 ,每次循环都会进行一次。好神奇,get it.