ABC216 E - Amusement Park(思维)
目录
Description
有 \(n\) 个数,每个数可以加到答案当中,但是之后需要做减一操作,问经过 \(k\) 次操作之后,所获得的最大值是多少
State
\(1<=n<=10^5\)
\(1<=k<=2*10^{9}\)
\(1<=a[i]<=2*10^{9}\)
Input
3 5
100 50 102
Output
502
Solution
这个题给人的第一印象就是用优先队列解决,但是介于 \(k\) 的数据范围,一旦跳出固有的思维模式,还是很好解决的
将所有的数按降序排序,每个数的权值为 \(i\),剩下的就是细节上的处理了
Code
const int N = 2e5 + 5;
int n, m, _, k;
int a[N];
ll calc(ll x, ll y)
{
ll ans = x * (x + 1) / 2;
ans -= y * (y + 1) / 2;
return ans;
}
signed main()
{
//IOS;
while(~ sdd(n, k)){
rep(i, 1, n) sd(a[i]);
sort(a + 1, a + 1 + n, greater<int>());
ll ans = 0;
for(int i = 1; i <= n && k; i ++){
ll res = a[i] - a[i + 1];
if(res * i <= k){
ans += calc(a[i], a[i + 1]) * i;
k -= res * i;
}
else{
int num = k / i;
ans += calc(a[i], a[i] - num) * i;
if(k % i){
ans += (a[i] - (ll)num) * (k % i);
}
k = 0;
}
//dbg(ans);
}
pll(ans);
}
//PAUSE;
return 0;
}

浙公网安备 33010602011771号