給定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
【輸出格式】
乙個整數,表示答案。
【輸入樣例】53
-100000
-10000
2100000
10000
【輸出樣例】
999100009
【動態規劃思路傳送門】【輸入樣例】53
-100000
-100000-2
-100000
-100000
【輸出樣例】
-999999829
因為大數乘大數一定大,所以可以貪最大的數字
#include
#include
#include
using
namespace std;
typedef
long
long ll;
#define maxlen 1009
#define mod 1000000009
#define mod109(x) ((x>=0) ? (x%mod) : (0-((0-x)%mod)))
#define llabs(x) ((x>=0) ? (x) : (-x))
#define inf 100000
typedef
struct num
num(
int val,
int abs)
:val
(val),ab
(abs)
}num;
struct cmp};
num a[maxlen]
;int n, k;
ll t, ans;
intmain()
a[i]
=num
(t,llabs
(t));}
sort
(a+1
, a+
1+n,
cmp())
;// 前k個絕對值大的數中負數個數
int neg_cnt =0;
for(
int i=
1; i<=k; i++)}
// 如果都為正數,或者負數為偶數個,直接乘
if(neg_cnt==
0|| neg_cnt%2==
0)}// 負數個數為奇數 ,嘗試替換
else
if(k%2==
1)}int index_pos = n;
for(
int i=k+
1; i<=n; i++)}
ll ans1 =1;
for(
int i=
1; i<=k; i++
)else
}// 找絕對值最小的正數,換後面絕對值最大的負數
index_pos =1;
for(
int i=k; i>=
1; i--)}
index_neg = n;
for(
int i=k+
1; i<=n; i++)}
ll ans2 =1;
for(
int i=
1; i<=k; i++
)else
}// 結果選最大
ans =
max(ans1, ans2);}
// 特殊處理0的情況,如果有0,但是最大結果小於0,直接返回0
if(ans<
0&& zero_flag==1)
else
return0;
}
藍橋杯 乘積最大II 動態規劃解法
因為資料不大,存在 暴力解法 今年是國際數學聯盟確定的 2000 世界數學年 又恰逢我國著名數學家華羅庚先生誕辰90周年。在華羅庚先生的家鄉江蘇金壇,組織了一場別開生面的數學智力競賽的活動,你的乙個好朋友xz也有幸得以參加。活動中,主持人給所有參加活動的選手出了這樣一道題目 設有乙個長度為n的數字串...
藍橋杯 最大乘積
演算法提高 最大乘積 時間限制 1.0s 記憶體限制 512.0mb 問題描述 對於n個數,從中取出m個數,如何取使得這m個數的乘積最大呢?輸入格式 第一行乙個數表示資料組數 每組輸入資料共2行 第1行給出總共的數字的個數n和要取的數的個數m,1 n m 15,第2行依次給出這n個數,其中每個數字的...
藍橋杯題目練習 乘積最大
題目描述 今年是國際數學聯盟確定的 2000 世界數學年 又恰逢我國著名數學家華羅庚先生誕辰90周年。在華羅庚先生的家鄉江蘇金壇,組織了一場別開生面的數學智力競賽的活動,你的乙個好朋友xz也有幸得以參加。活動中,主持人給所有參加活動的選手出了這樣一道題目 設有乙個長度為n的數字串,要求選手使用k個乘...