C - Sweets Eating 前缀和 + 思维找规律

传送门
思路: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;
}

发布了241 篇原创文章 · 获赞 8 · 访问量 4861

猜你喜欢

转载自blog.csdn.net/weixin_43960370/article/details/103316745
今日推荐