AcWing 1239. 乘积最大(贪婪)

Problem

第九届蓝桥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();

    }
}
发布了167 篇原创文章 · 获赞 3 · 访问量 3393

猜你喜欢

转载自blog.csdn.net/qq_43515011/article/details/104742812
今日推荐