链接:登录—专业IT笔试面试备考平台_牛客网
贪心来做,首先,认识到乘法的贡献大于加法,所以可以先让数组从小到大排序,然后将数组一分为二,一部分用来加,一部分用来乘,加法数组的数组要从大到小排序,乘法要从小到大排序,因为要让加的数尽可能大,所以就让两个大数相加,最后乘上的那个数一定是最大的。
所以新数组的排序为:{加数组最大的两个数相加,乘数组[1],加数组[1] ....};
#include <bits/stdc++.h>
using namespace std;
long long a[999999];
const int N = 2e5 + 10;
const long long mod = 1e9 + 7;
vector<long long> j,c;
long long arr[999999];
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> a[i];
}
sort(a + 1,a + 1 + n);
for(int i = n / 2 + 1; i >= 1; i--) j.push_back(a[i]);
for(int i = n / 2 + 2; i <= n; i++) c.push_back(a[i]);
long long cnt = 2;
long long l = 2, r = 0;
long long k = 2;
arr[1] = j[0];
arr[2] = j[1];
while(cnt < n)
{
if(cnt % 2 == 0)
{
arr[++cnt] = c[r];
r++;
}
else
{
arr[++cnt] = j[k];
k++;
}
}
long long sum = (arr[1] + arr[2]) % mod;
for(int i = 3; i <= n; i++)
{
if(i % 2 == 1)
{
sum = (sum * arr[i]) % mod;
}
else
{
sum = (sum + arr[i]) % mod;
}
}
printf("%lld", sum % mod);
return 0;
}