[乘积最大]
题目
话8多说先上题目:
给定N个整数A1, A2, ... AN。请你从中选出K个数,使其乘积最大。
请你求出最大的乘积,由于乘积可能超出整型范围,你只需输出乘积除以1000000009的余数。
注意,如果X<0, 我们定义X除以1000000009的余数是负(-X)除以1000000009的余数。
即:0-((0-x) % 1000000009)
【输入格式】
第一行包含两个整数N和K。
以下N行每行一个整数Ai。
对于40%的数据,1 <= K <= N <= 100
对于60%的数据,1 <= K <= 1000
对于100%的数据,1 <= K <= N <= 100000 -100000 <= Ai <= 100000
【输出格式】
一个整数,表示答案。
【输入样例】
5 3
-100000
-10000
2
100000
10000
【输出样例】
999100009
再例如:
【输入样例】
5 3
-100000
-100000
-2
-100000
-100000
【输出样例】
-999999829
思路
这道题之前是在另外一个博文上看到的,当时没有标明输入的数据的范围,然后看了一下是最后一道题,还以为得用大数来做。后来在蓝桥官网上面去下载了原题的txt文档,才发现输入的整数是有数据范围的,这样思考起来就简单多了。题目当中给定的数据范围为 -100000 <= Ai <= 100000 ,这样输入的数据大概可以分为一下几种情况来考虑:
- 输入的数据全为正数,没有负数和0,这样直接将全部数据由大到小排序,取前K个数据相乘,使用 long long outNum储存相乘的结果,注意这里相乘结果可能会溢出,因此每次相乘后都要对1000000009取余;
- 输入的数据含有正数,没有负数,含有0。与前面一样,先进行排序,取前K个数相乘取余,这种情况可以和第一种情况归为一类;
- 输入的数据没有正数,含有负数,没有0。相同的,先进行排序,若K为偶数:从数组的最后向前取数;若为奇数,相乘一定为负数,则从数组的开头开始取数;
- 输入的数据中含有负数和0,没有正数,若K为奇数:直接输出为0;若K为偶数:从数组的末尾向前取;
- 输入的数据中含有正数和负数,将数组按照绝对值由大到小排序,取前K个数据,并统计前K个数据中负数的个数。若负数的个数为偶数:直接从前面开始取数。若负数的个数为奇数