要求
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
给一个长度为n的序列ai,一开始你有一个数A = 0,每次可以从序列中选一个数b,令A = A + b或者A = A * b,每个数都要使用一次,加的次数要和乘的次数相同,要求最大化A,输出A对998244353取模的值。
注:n ≤ 5×10^ 5 且为偶数, 1 ≤ ai ≤ 10^9
输入描述
第一行为一个整数n,表示序列的长度
第二行为n个整数ai描述这个序列
输出描述
一个非负整数,表示A的最大值对998244353取模的值
设计思路
很容易想到先排序(正序),把前面一半数加起来,再把后面一半数字乘起来即可
代码
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const long long max1 = 998244353;
int N;
int main()
{
LL A = 0;
cin >> N;
int ans[N];
for(int i = 0; i < N; i++)
{
cin >> ans[i];
}
sort(ans, ans + N);
int i = 0;
for(i = 0; i < (N / 2); i++)
{
A += ans[i];
A = A % max1;
}
for(; i < N; i++)
{
A = A * ans[i];
A = A % max1;
}
cout << A;
return 0;
}