题解 CF1415E 【New Game Plus!】
首先,看到数据范围里
由于带
由于我们可以进行
首先,每一组内部一定是不上升的,否则交换两个位置一定更优。
所以我们先要把
then?
令第
可以发现,当选择最大的
用一个堆维护即可。
代码实现非常简单,没有任何细节。
#include<bits/stdc++.h>
#define re register
#define int long long
using namespace std;
inline int read(){
re int t=0,f=0;re char v=getchar();
while(v<'0')f|=(v=='-'),v=getchar();
while(v>='0')t=(t<<3)+(t<<1)+v-48,v=getchar();
return f?-t:t;
}
priority_queue<int>q;
int n,m,t,a[1000002],h[1000002];
long long ans,sum;
signed main(){
n=read(),m=read();
for(re int i=1;i<=n;++i)a[i]=read();
sort(a+1,a+n+1),reverse(a+1,a+n+1);
for(re int i=1;i<=m+1;++i)q.push(0);
for(re int i=1;i<=n;++i){
int xx=q.top();
q.pop();
ans+=xx;
xx+=a[i];
q.push(xx);
}
printf("%lld",ans);
}