题目大意
给一个长度为
n
n
n 的序列
a
i
a_i
ai,一开始你有一个数
A
=
0
A = 0
A=0,每次可以从序列中选一个数
b
b
b,令
A
=
A
+
b
A = A + b
A=A+b 或者
A
=
A
∗
b
A = A * b
A=A∗b,每个数都要使用一次,加的次数要和乘的次数相同,要求最大化A,输出
A
A
A 对 998244353
取模的值。
解题思路
一看肯定是贪心。
先排个序。
因为输入保证 n n n 为偶数,所以把 A A A 与前 n / 2 n/2 n/2 个数加起来。
然后把 A A A 与后 n / 2 n/2 n/2 个乘起来。
即为当 A A A 取 ( ∑ i = 1 n / 2 a i ) ∗ ∏ j = n / 2 + 1 n a j (\sum\limits_{i=1}^{n/2}a_i)*\prod\limits_{j=n/2+1}^{n}a_j (i=1∑n/2ai)∗j=n/2+1∏naj 时,为最大值。
AC CODE
#include <bits/stdc++.h>
using namespace std;
#define _ (int) 5e5 + 7
long long n;
long long a[_];
long long ans;
const long long mod = 998244353;
signed main()
{
scanf("%lld", &n);
for(long long i = 1; i <= n; ++i)
{
scanf("%lld", &a[i]);
}
sort(a + 1, a + n + 1);
for(long long i = 1; i <= n / 2; ++i)
{
ans = ((ans % mod) + (a[i] % mod)) % mod;
ans %= mod;
}
for(long long i = n / 2 + 1; i <= n; ++i)
{
ans = ((ans % mod) * (a[i] % mod)) % mod;
ans %= mod;
}
printf("%lld\n", ans);
return 0;
}