传送门
思路:1.找出最优策略
2.优化代码
最主要的是如何优化代码,我们发现m是一个周期,在m周期类的元素不会受到影响,一旦到达一个周期,那么此时的数值就要整体移一位,这个可以用前缀和来实现。
设dp[i]为第i天的最小惩罚,如果i > m dp[i]就会等于第i - m天在原来的二倍基础上再加当前位于m周期内的数。(这个就要用到前缀和实现)。
#include<iostream>
#include<set>
#include<algorithm>
using namespace std;
long long dp[200005];
set<int>s;
long long a[200005];
long long sum[200005];
int main()
{
int n,m;
cin >> n >> m;
for(int i = 1;i <= n;i++)
cin >> a[i];
sort(a + 1, a + n + 1);
for(int i = 1;i <= n;i++)
{
sum[i] = sum[i - 1] + a[i];
if(i <= m)
dp[i] = dp[i - 1] + a[i];
else dp[i] = dp[i - m] + sum[i];
cout << dp[i] <<" ";
}
cout << endl;
return 0;
}