解题思路

给一个长度为 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;
}