CodeForces.1174D.ArraySplitting.(后缀和数组 + 贪心)

橙三吉。 提交于 2020-02-04 13:18:34

  题目链接

参考代码:

#include <cstdio>
#include <algorithm>
using namespace std;

typedef long long ll;
const int maxn = 300000 + 5;
int n, k;
ll ans = 0, value[maxn];

bool cmp(const ll  &a, const ll  &b) {
    return a > b;
}

int main() {
    scanf("%d %d", &n, &k);
    for(int i = 1; i <= n; i ++) scanf("%I64d", &value[i]);
    for(int i = n; i; i --) value[i] += value[i + 1];//构造value后n项和的后缀和数组
    sort(value + 2, value + n + 1, cmp);//对后n - 1项进行排序,因为第后n项和是必须要加的
    for(int i = 1; i <= k; i ++) ans += value[i];//选取其中最大的n - 1项和第一项即可,就可以实现将所选的数字加k次
    printf("%I64d\n", ans);
    return 0;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!