解析
这题可以转化一下:
(《神笔马良》。。。。)
计算这些长方形对应下标的总加和
我们可以一层一层往上垒,假设第i层起始点为xi,总和为sumi,再设从1到i的前缀和为si
显然第一层x1=1,sum1=sn
对于第二层x2,sum2=tot[x2,n]=sn-s[x2-1]
对于第三层x3,sum3=sn-s[x3-1]
。。。
对于第k层xk,sumk=sn-s[xk-1]
最后累加sum即答案
显然答案整理一下应为k*sn-(s[x2-1]+s[x3-1]+…+s[xk-1])
要使ans最大,显然要使括号内最小
那么我们只需找出最小的k-1个(因为第一层不减)最小的前缀和再用k*sn减去他们即可
注意因为xk<=n,xk-1<n-1,所以sn是不能作为减数的
代码
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<string>
#include<queue>
#include<vector>
using namespace std;
int n,k;
int a[300500];
long long s[300500]={ };
bool cmp(long long x,long long y){return x<y;
}
int main(){scanf("%d%d",&n,&k);for(int i=1;i<=n;i++){scanf("%d",&a[i]);s[i]=s[i-1]+a[i];}long long ans=s[n]*k;sort(s+1,s+n,cmp);//最后一个不能取 for(int i=1;i<=k-1;i++){ans-=s[i];}printf("%lld\n",ans);return 0;
}