CF1456C. New Game Plus!
题目大意
n个数,有一个初始为0的计数器,每选一个数答案会加计数器的值,然后计数器加上该数
有k次计数器归0的机会,求最大答案
题解
我是sb
正数显然直接从大往小选,然后负数从小往大选,如果和小于0了就考虑使用归0
k次归0等价于k+1个挡板,每个数x的贡献为x*到某个挡板的距离
所以把负数排序从小往大贪心往挡板里放,再加上之前的和*max挡板长度即可
code
#include <bits/stdc++.h>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define ll long long
//#define file
using namespace std;
int n,i,j,k,l,K;
ll a[500001],s,ans;
bool cmp(int a,int b) {return a>b;}
int main()
{
#ifdef file
freopen("c.in","r",stdin);
#endif
scanf("%d%d",&n,&K);
fo(i,1,n) scanf("%lld",&a[i]);
sort(a+1,a+n+1,cmp);
fo(i,1,n)
{
if (s+a[i]<0) break;
ans+=s,s+=a[i];
}
++K;l=i;j=0,k=0;
fd(i,n,l)
{
ans+=a[i]*k;
if (!j) ans+=s;
++j;
if (j==K) j=0,++k;
}
cout<<ans<<endl;
fclose(stdin);
fclose(stdout);
return 0;
}