原題:
算法提高 最大乘積 時間限制:1.0s 內存限制:512.0MB 問題描述 對于n個數,從中取出m個數,如何取使得這m個數的乘積最大呢?輸入格式 第一行一個數表示數據組數 每組輸入數據共2行: 第1行給出總共的數字的個數n和要取的數的個數m,1<=n<=m<=15, 第2行依次給出這n個數,其中每個數字的范圍滿足:a[i]的絕對值小于等于4。輸出格式 每組數據輸出1行,為最大的乘積。樣例輸入15 51 2 3 4 2樣例輸出48 分析:一開始想著先排序然后i,j分別記住開始和結束,然后兩個兩個相乘取大的乘積,錯了好幾次才反應過來,如果是負的兩個相乘比較大,就取這兩個,而如果是兩個正的相乘比較大,則只取最大的那一個正數,這樣保證如果m為奇數,最后取得那個數比較大。
代碼:
#include <algorithm>#include <iostream>using namespace std;int main(){ int t; cin>>t; while(t--) { int n,m; cin>>n>>m; int num[n],sum = 1; for(int i = 0;i < n;i++) cin>>num[i]; sort(num,num+n); int i = 0,j = n - 1; while(m >= 2) { if(num[i] * num[i + 1] >= num[j] * num[j - 1]) { sum *= num[i] * num[i + 1]; i += 2; m -= 2; } else { sum *= num[j]; j--; m--; } } if(m == 1) { sum *= num[j]; } cout<<sum<<endl; } return 0;}
新聞熱點
疑難解答