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;
}
posted @ 2021-09-21 20:42  Bcoi  阅读(110)  评论(0)    收藏  举报