藍橋杯 最大乘積

2021-07-09 13:56:07 字數 1051 閱讀 6670

演算法提高 最大乘積  

時間限制:1.0s   記憶體限制:512.0mb

問題描述

對於n個數,從中取出m個數,如何取使得這m個數的乘積最大呢?

輸入格式

第一行乙個數表示資料組數

每組輸入資料共2行:

第1行給出總共的數字的個數n和要取的數的個數m,1<=n<=m<=15,

第2行依次給出這n個數,其中每個數字的範圍滿足:a[i]的絕對值小於等於4。

輸出格式

每組資料輸出1行,為最大的乘積。

樣例輸入 1

5 51 2 3 4 2

樣例輸出

48

一般人的思路都是想排序後取最大的m個數的乘積,然而應該注意到有時候負數與負數相乘所得的正數更大,因此得改變思維策略。

如果要取的數m是偶數的話,從小到大排序後,依次從後面和從前面取兩個數的乘積進行比較,如果較大兩個數的乘積更大,理所當然取這兩個數,如果較小的兩個數乘積更大,說明這兩個數一定是負數,既然相乘後是乙個很大的正數,因此可以同時去取這兩個數。這樣下去直到取滿m個數為止。

如果要取得數是奇數的話,把排序後最大的那個數a[n-1]單獨拿出來,如果它是正數的話,對剩下n-1(偶數)個數同樣用之前的方法進行取數,取m-1個,再乘以a[n-1]就是最大乘積。如果a[n-1]是負數,則對剩下的n-1(偶數)個數中取出乙個絕對值最大的負數,實際上就是構造最小乘積,按照和之前相反的方法去做。

具體見**。

#include#includeusing namespace std;

int main()

else}}

else

else

}ans*=a[n-1];

}else

{while(m>0)

{zheng=a[pos1]*a[pos1+1];

ni=a[pos2]*a[pos2-1];

if(zheng

藍橋杯 演算法提高 最大乘積

演算法提高 最大乘積 時間限制 1.0s 記憶體限制 512.0mb 問題描述 對於n個數,從中取出m個數,如何取使得這m個數的乘積最大呢?輸入格式 第一行乙個數表示資料組數 每組輸入資料共2行 第1行給出總共的數字的個數n和要取的數的個數m,1 n m 15,第2行依次給出這n個數,其中每個數字的...

藍橋杯 演算法提高 最大乘積

問題描述 對於n個數,從中取出m個數,如何取使得這m個數的乘積最大呢?輸入格式 第一行乙個數表示資料組數 每組輸入資料共2行 第1行給出總共的數字的個數n和要取的數的個數m,1 n m 15,第2行依次給出這n個數,其中每個數字的範圍滿足 a i 的絕對值小於等於4。輸出格式 每組資料輸出1行,為最...

藍橋杯演算法提高 最大乘積

問題描述 對於n個數,從中取出m個數,如何取使得這m個數的乘積最大呢?輸入格式 第一行乙個數表示資料組數 每組輸入資料共2行 第1行給出總共的數字的個數n和要取的數的個數m,1 n m 15,第2行依次給出這n個數,其中每個數字的範圍滿足 a i 的絕對值小於等於4。輸出格式 每組資料輸出1行,為最...