首先说一种错误的做法,直接将所有元素放到堆里面,然后每次让最大的两个元素和
出堆,然后放入
和
,这样会导致
非常大,不能够这样做,并且由于需要比大小,所以中间过程不能够取模。
正解的话可以举例子看一下:
6 = 1 * 6 = 2 * 3
20 = 1 * 20 = 2 * 10 = 4 * 5
可以发现总是 和
这样形式的和最大,详细证明题解区已经有了,可以去看看。
那么我们就可以给他排序,对于次操作,其实就是最大的
个数的乘积,加上
。
最后再加上剩余的元素即可。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define close ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
const int MOD = 1e9 + 7;
signed main() {
close;
int n,k;
cin >> n >> k;
vector<int> a(n);
for(int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a.begin(),a.end());
int res = k;
int mul = 1;
k += 1;
//[n - 1,n - k]
for(int i = n - 1;i >= n - k; i--){
mul *= a[i];
mul %= MOD;
}
res += mul;
res %= MOD;
for(int i = n - k - 1; i >= 0; i--){
res += a[i];
res %= MOD;
}
cout << res << endl;
return 0;
}