第九屆藍橋杯B組省賽———乘積最大
標題:乘積最大
給定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
思路
這一題要分情況討論,分負數個數為偶數和奇數,還有全為偶數的情況,k為偶數和奇數的情況,發現其規律,進行求解。
程式碼
#include <stdio.h>
typedef long long LL;
const int mod = 1000000009;
int compare(const void *a, const void *b)
{
return (*(int*)a - *(int*)b);
}
int main()
{
int n, k;
int A[100010];
scanf("%d %d", &n, &k);
int i;
for (i = 0; i < n; i++) scanf("%d", &A[i]);
qsort(A, n, sizeof(int), compare);
int sign = 1;
int l = 0, r = n - 1;
LL res = 1;
if (k % 2 == 1) {
res = A[r];
r--;
k--;
if (res < 0) sign = -1;
}
while (k) {//取偶數個數,兩兩取,因為有負數,所以選兩邊最大那個
LL x = (LL)A[l] * A[l + 1];
LL y = (LL)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;
}
printf("%lld", res);
return 0;
}
相關文章
- 第六屆藍橋杯省賽CC++B組C++
- 2018藍橋杯省賽B組
- 2017省賽藍橋杯B組
- 藍橋杯__省賽__第九屆__C/C++__大學A組C++
- 第九屆藍橋杯軟體類省賽 Java B組 題目及解析Java
- 2018年第九屆藍橋杯省賽試題及詳解(Java本科B組)Java
- 第十三屆藍橋杯省賽A組
- 第十三屆藍橋杯省賽C/C++ B組C++
- 第九屆藍橋杯省賽C++A組 倍數問題(dfs)C++
- 2018第九屆藍橋杯省賽C++B組【第四題:測試次數】C++
- 第14屆藍橋杯B組國賽
- 第十五屆藍橋杯C++B組省賽總結C++
- 2015年藍橋杯六屆省賽大學B組真題
- 第十屆藍橋杯省賽C++B組 等差數列C++
- [藍橋杯] 乘積最大(dfs或dp)
- 2016年省賽第七屆藍橋杯B組C/C++第九題解 交換瓶子C++
- 2018年第九屆藍橋杯省賽試題及詳解(Java本科A組)Java
- 第十五屆藍橋杯軟體賽省賽C/C++B 組題解C++
- [藍橋杯2018決賽]最大乘積
- 試題B:小球反彈(第十五屆藍橋杯省賽B組c/c++組)C++
- 藍橋杯__省賽__第七屆__C/C++__大學A組C++
- 藍橋杯__省賽__第八屆__C/C++__大學A組C++
- 【藍橋杯考前突擊】第十屆藍橋杯省賽C/C++大學B組 試題 D 數的分解C++
- 第十四屆藍橋杯省賽C++ B組(個人經歷 + 題解)C++
- 2017第八屆藍橋杯C/C++ B組省賽第二題 秒解C++
- 第十一屆藍橋杯省賽CC++組第二場比賽C++
- 2013第四屆藍橋杯省賽C++B組【第六題:三部排序】C++排序
- 2020藍橋杯省賽B組C++(第二場)真題C++
- 藍橋杯第五屆省賽題目及題解
- 歷屆藍橋杯省賽(C、C++)的答案(轉)C++
- 第九屆藍橋杯大賽個人賽決賽(軟體類本科B組)做題筆記 mit zwei Antworten筆記MIT
- 第十五屆藍橋杯大賽軟體賽省賽 C/C++ 大學 A 組C++
- 藍橋杯省賽真題2015年第六屆Java本科B組第01題——三角形面積Java
- 2019年省賽第十屆藍橋杯B組C/C++試題H解 等差數列C++
- 藍橋杯刷題-乘積尾零
- 2013第四屆藍橋杯省賽C++A組【第一題:高斯日記】C++
- 【題解】爬山 藍橋杯2024省B
- 2015藍橋杯省賽javaA組-----牌型種數(填空)Java