题目链接:https://codeforces.com/contest/1253/problem/C
思路:我们可以知道值最小的糖果最后吃,所以先给糖果排个序,然后求出前缀和(隔m个数的数的前缀和,a1+a(1+m)+a(1+2*m)+.......)加进来的糖果只会影响他前m个位置的糖果,每一次后一天只需要在前一天基础加一个这个前缀和就好了,
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<cmath>
#include<stack>
#include<map>
#include<set>
using namespace std;
#define LL long long
const int mod=1000000007;
const int inf=0x3f3f3f3f;
const LL inff=0x3f3f3f3f3f3f3f3f;
const LL N=200005;
const LL M=5;
#define MEF(x) memset(x,-1,sizeof(x))
#define ME0(x) memset(x,0,sizeof(x))
#define MEI(x) memset(x,inf,sizeof(x))
int a[N];
LL ans[N],temp[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+1+n);
for(int i=1;i<=n;i++)
{
if(i<=k)
{
temp[i]=a[i];
}
else
{
temp[i]=temp[i-k]+a[i];
}
}
for(int i=1;i<=n;i++)
{
ans[i]=ans[i-1]+temp[i];
}
for(int i=1;i<=n;i++)
{
cout<<ans[i];
i==n?cout<<endl:cout<<' ';
}
return 0;
}