E - Amusement Park (atcoder.jp)
题意:
思路:
首先,优先访问ai大的贡献一定大
因此可以考虑把ai从小到大排个序,然后从尾部遍历
然后去计算贡献
贡献比较难推,但是手搓一下还是可以推出来的
先想出几何模型,再去手推
如果不会几何模型,直接去手推找规律也可
Code:
#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[100005];
signed main()
{
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+1+n);
long long ans=0;
for(int i=n;i>=1;i--)
{
int num = n-i+1;
int cost = num*(a[i]-a[i-1]);
if(cost<=k)
{
k-=cost;
ans+=num * (a[i]+a[i-1]+1) * (a[i]-a[i-1]) / 2;
}
else
{
int t1 = k/num;
int t2 = k%num;
ans += num * (a[i] + a[i]-t1+1) * t1 / 2;
ans += (a[i]-t1)*t2;
break;
}
}
printf("%lld\n",ans);
}