传送门 思路:做这种思维题就是找每一步的状态,我们把每一个状态分为两种 加上当前可加值 和 删去一个当前最小值,再维护一个 最大值即可。这里需要注意的是,k与m 要经常比较大小。
using namespace std;
long long a[100005];
int main()
{
long long n, m, k;
cin >> n >> k >> m;
long long sum = 0;
double maxn = 0.0;
double maxnn = 0.0;
for(int i = 1; i <= n; i++)
{
cin >> a[i];
sum += a[i];
}
maxnn = (sum * 1.0) / n;
sort(a + 1, a + n + 1);
for(int i = 1; i <= n; i++)
{
if(n == i)
{
maxnn = (sum + min(k, m)) > maxnn ? (sum + min(k, m)) : maxnn;//还剩一个
break;
}
maxn = (double)max((sum + min(k * (n - i + 1), m)) / (1.0 * (n - i + 1)), (1.0 * (sum - a[i]))/ (1.0 * (n - i)));
maxnn = max(maxnn, maxn);
m--;
if(m == 0)
break;
sum -= a[i];
}
printf("%.20lf\n",maxnn);
return 0;
}