第九屆藍橋杯十題 乘積最大 dp 滾動陣列

2022-07-21 19:03:18 字數 1884 閱讀 2274

給定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

資源約定:

峰值記憶體消耗(含虛擬機器) < 256m

cpu消耗 < 1000ms

請嚴格按要求輸出,不要畫蛇添足地列印類似:「請您輸入...」 的多餘內容。

注意:main函式需要返回0;

只使用ansi c/ansi c++ 標準;

不要呼叫依賴於編譯環境或作業系統的特殊函式。

所有依賴的函式必須明確地在原始檔中 #include

不能通過工程設定而省略常用標頭檔案。

提交程式時,注意選擇所期望的語言型別和編譯器型別。

題解:我們用dp[ i ][ [ j ]表示前j個陣列我們選擇了i個

狀態轉移方程

i==1  dp[ i ][ j ] =max( dp[ i ] [j-1] ,a[j] )

i==j   dp[ i ] [ j ]= dp[ (i-1) ][j-1]*a[j]

dp[ i ] [ j ] = max (dp[ i-1 ][ j-1]*a[ j ] , dp[ i ][j-1])

這樣寫可以過60%的樣例,就爆空間了,

觀察轉移方程,很明顯我們可以用2個狀態就可以完成。

所以我們用滾動陣列進行壓縮空間

#include #define inf 0x3f3f3f3f

using

namespace

std;

typedef

long

long

ll;const

int mod=1e9+9

;const

int maxn=1e6+7

;int

a[maxn];

ll dp[

3][maxn];

intmain()

memset(dp,-inf,sizeof

(dp));

for(int i=1;i<=k;i++)

if(i==j) dp[i%2][j]= dp[ (i-1)%2 ][j-1]*a[j];

else dp[i%2][j]= max( dp[ (i-1)%2 ][j-1]*a[j],dp[i%2][j-1] ) %mod;

//for(int i=0;i<=1;i++)

//coutcout<}

}cout

<2][n]%mod

}

藍橋杯 第九屆 C題 乘積尾零

如下的10行資料,每行有10個整數,請你求出它們的乘積的末尾有多少個零?5650 4542 3554 473 946 4114 3871 9073 90 4329 2758 7949 6113 5659 5245 7432 3051 4434 6704 3594 9937 1173 6866 339...

第九屆藍橋杯5 7題

description 以下 可以從陣列a中找出第k小的元素。它使用了類似快速排序中的分治演算法,期望時間複雜度是o n 的。請仔細閱讀分析原始碼,填寫劃線部分缺失的內容。input 見上文描述。output 注意 只填寫劃線部分缺少的 不要抄寫已經存在的 或符號。注意 題目要求的是時間複雜度是要o...

藍橋杯第九屆決賽

x星球的鈔票的面額只有 100元,5元,2元,1元,共4種。小明去x星旅遊,他手裡只有2張100元的x星幣,太不方便,恰好路過x星銀行就去換零錢。小明有點強迫症,他堅持要求200元換出的零鈔中2元的張數剛好是1元的張數的10倍,剩下的當然都是5元面額的。銀行的工作人員有點為難,你能幫助算出 在滿足小...