---
tags: 题解,算法
---
# 从入门到头秃练习赛 18 F题题解
## 题目 https://vjudge.net/contest/446091#problem/F
## 分析
先对数组排序,然后根据k的奇偶性分类
### 1. 如果k是奇数,且数组最大值是负数
那么按从大到小一个一个取即可
### 2. 如果k是偶数,或数组最大值非负
那么最大值一定非负,如果k是奇数,那先把数组最大的数取了,变成偶数的情况。然后比较最小的两个数的积与最大的两个数的积,哪边大取哪边即可。
## 参考代码
```cpp=
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
int solve(int n, int a[], int k) {
sort(a, a + n);
int mod = 1e9+7;
ll ret = 1;
if (a[n-1] >= 0 || k%2 == 0) {
if (k%2) ret = a[--n], --k;
for (; k >= 2; n -= 2, k -= 2) {
ll l = (ll)a[0] * a[1], r = (ll)a[n-1] * a[n-2];
if (l < r) {
ret = ret * (r % mod) % mod;
} else {
ret = ret * (l % mod) % mod;
a += 2;
}
}
} else {
for (--n; k; --n, --k) {
ret = ret * a[n] % mod;
if (ret < 0) ret += mod;
}
}
return (ret + mod) % mod;
}
int main() {
int n, m;
cin >> n >> m;
vector<int> a(n);
for (int i = 0; i < n; ++i) cin >> a[i];
cout << solve(n, &a[0], m) << endl;
return 0;
}
```