第九届蓝桥B组省赛最后一题
这个题问的是给一群数,问选k个相乘得到最大值,很明显是个贪心问题,但是可能没想到是用分类讨论能AC的题目,去年好像对这个题没有什么想法。
1.k 如果是偶数的话,选出来的结果一定是非负数 , 原因如下:
(1) # 负数的个数是偶数个的话,负负得正,那么一定是非负数
(2) # 负数的个数如果是奇数个的话,那么我们就只选偶数个绝对值最大的负数
2.k 如果是奇数个的话,
(1)# 所有的数字如果都是负数,那么选出来的结果也一定都是负数
(2)# 否则的话,则一定至少有 1个非负数, 那么我们将最大的数取出来, 此时要选的个数就是 k–,
# k-- 是偶数,那么就又转化为 k-- 是偶数的情况思考
有点绕
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Scanner;
class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter pw = new PrintWriter(System.out);
static Scanner sn = new Scanner(System.in);
static int N = 100010, mod = 1000000009;
static long a[] = new long[N];
static int n, k;
static long res = 1;
public static void main(String[] args) throws IOException {
n = sn.nextInt();
k = sn.nextInt();
for (int i = 0; i < n; i++) a[i] = sn.nextLong();
if (k == n) {
for (int i = 0; i < n; i++) {
res *= a[i];
}
System.out.print(res);
System.exit(0);
}
Arrays.sort(a, 0, n);
int l = 0, r = n - 1;
int sign = 1;
if ((k & 1) == 1) {
res = a[r];
r--;
k--;
if (res < 0) sign = -1;
}
while (k > 0) {
long x = a[l] * a[l + 1];
long y = a[r] * a[r - 1];
if (x * sign > y * sign) {
res = x % mod * res % mod;
l += 2;
} else {
res = y % mod * res % mod;
r -= 2;
}
k -= 2;
}
pw.print(res);
pw.flush();
pw.close();
br.close();
}
}