分析
对于一个确定的 ,答案一定是可以取到前 个最大的值,所以只需要排序,再维护一个前缀和。最后时间复杂度为 。
代码
#include<bits/stdc++.h> using namespace std; #define LL long long const int N = 1e5 +10; LL A[N],sum[N],n,X,Y,ans; bool cmp(LL x,LL y) {return x > y;} int main() { scanf("%lld",&n); for(int i = 1;i <= n;i++) scanf("%lld",&A[i]); sort(A+1,A+1+n,cmp); scanf("%lld%lld",&X,&Y); for(int i = 1;i <= n;i++) sum[i] = sum[i-1] + A[i]; for(int i = 1;i <= X;i++) { for(int j = 1;j <= Y;j++) { ans += sum[i*j]; } } cout << ans << endl; }