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;
}
posted @ 2020-11-29 19:33  gmh77  阅读(200)  评论(0编辑  收藏  举报