解题思路
给一个长度为 n 的序列 a,一开始有一个数 A = 0,每次可以从序列中选一个数 b,令 A = A + b 或者 A = A * b,每个数都要使用一次,加的次数要和乘的次数相同,要求最大化 A,输出 A 对 998244353 取模的值。
对序列 a 进行排序,将前 n/2 个数相加,再依次乘以后面 n/2 个数。
C++代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int mod = 998244353;
int main(){
int n;
cin >> n;
vector<int> a(n);
for(int i=0; i<n; ++i)
cin >> a[i];
sort(a.begin(), a.end());
long long A = 0;
for(int i=0; i<n/2; ++i)
A += a[i];
A %= mod;
for(int i=n/2; i<n; ++i){
A *= a[i];
A %= mod;
}
cout << A << endl;
return 0;
}
京公网安备 11010502036488号