链接:登录—专业IT笔试面试备考平台_牛客网
贪心来做,首先,认识到乘法的贡献大于加法,所以可以先让数组从小到大排序,然后将数组一分为二,一部分用来加,一部分用来乘,加法数组的数组要从大到小排序,乘法要从小到大排序,因为要让加的数尽可能大,所以就让两个大数相加,最后乘上的那个数一定是最大的。
所以新数组的排序为:{加数组最大的两个数相加,乘数组[1],加数组[1] ....};
#includeusing namespace std; long long a[999999]; const int N = 2e5 + 10; const long long mod = 1e9 + 7; vector 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; }



