標題:乘積最大
給定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
10000
100000
100001
【輸出樣例】
999100009
再例如:
【輸入樣例】
5 3
-100000
-100000
-2
-100000
-100000
【輸出樣例】
-999999829
資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗 < 1000ms
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。
注意:
main函數需要返回0;
只使用ANSI C/ANSI C++ 標准;
不要調用依賴於編譯環境或操作系統的特殊函數。
所有依賴的函數必須明確地在源文件中 #include
不能通過工程設置而省略常用頭文件。
提交程序時,注意選擇所期望的語言類型和編譯器類型。
思路:雙指針;1.sort排序這N個數 2.使用兩個指針:最左left,最右right 3.左邊2個2個選 右邊1個1個選(因為乘積要最大,貪心選,不能是負數(除非特殊情況)
代碼:
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int n,k;
int a[100010];
int b[100010];
int main(){
cin>>n>>k;
int l = 1;
int r = n;
int t = 1;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);
while(t<=n && l<r){
if(a[l] * a[l+1] > a[r] * a[r-1] && t+1<=k){
b[t++] = a[l];
b[t++] = a[l+1];
l+=2;
}else{
b[t++] = a[r];
r--;
}
}
for(int i=1;i<=k;i++){
cout<<b[i]<<endl;
}
}
ps:沒有測試大數據,朋友們如果有做藍橋杯題目的網站,歡迎下方評論區留言!
方法二dfs求出所有全排列,再選取乘積最大的,求余數(大數過不了):
#include<iostream>
#include<algorithm>
#define ppp 1000000009
using namespace std;
/*思路:枚舉所有組合(選取k個數) 再求出各組的乘積 取最大值*/
int n,k;
int arr[100010];
int ans[100010];
int vis[100010];
long long final[100010];
int t = 0;
//大數乘法,乘法這里有問題 求余的地方不對 什么時候該求余?
long long cheng(int ans[]){
long long sum = 1;
for(int i=0;i<k;i++){
int flag = 0;
long long ansLocal = ans[i];
if(ans[i]<0){
flag = 1;
ansLocal = -ansLocal;
}
sum = ((sum%ppp) * (ansLocal%ppp) )%ppp;
if(flag) sum = -sum;
}
return sum;
}
long long cheng2(int ans[]){
long long sum = 1;
for(int i=0;i<k;i++){
int flag = 0;
sum*= ans[i];
}
return sum;
}
//-100000 -10000 100000 999100009
//-100000 -10000 2 999999991
void dfs(int x){
if(x==k){
//計算ans中k個值的乘積處以1000000009
long long answer = cheng2(ans);
// 999999991
// if(answer == 999999991){
// for(int j = 0; j < k; j++){
// cout<<"jjj = "<<j<<" "<<ans[j]<<endl;
// }
// }
final[t++] = answer;
return;
}
for(int i=0;i<n;i++){
if(!vis[i]){
vis[i] = 1;
ans[x] = arr[i];
dfs(x+1);
vis[i] = 0;
}
}
}
int main(){
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>arr[i];
vis[i] = 0;
}
dfs(0);
sort(final,final+t);
for(int i=0;i<t;i++){
cout<<i<<" "<<final[i]<<endl;
}
cout<<final[t-1]%ppp<<endl;//結果和題目中的輸出樣例不符合
return 0;
}
