CodeForces.1174D.ArraySplitting.(后缀和数组 + 贪心)
参考代码:
#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; }
时间并不会因为你的迷茫和迟疑而停留,就在你看这篇文章的同时,不知道有多少人在冥思苦想,在为算法废寝忘食,不知道有多少人在狂热地拍着代码,不知道又有多少提交一遍又一遍地刷新着OJ的status页面……
没有谁生来就是神牛,而千里之行,始于足下!