藍橋杯 乘積最大 貪心解法

2021-10-02 17:45:15 字數 2220 閱讀 9936

給定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個乘...