[藍橋杯][演算法提高VIP]最大乘積 貪心 雙指標
藍橋杯歷年真題題目及題解目錄彙總
題目描述
對於n個數,從中取出m個數,如何取使得這m個數的乘積最大呢?
輸入
第一行一個數表示資料組數
每組輸入資料共2行:
第1行給出總共的數字的個數n和要取的數的個數m,1<=n<=m<=15,
第2行依次給出這n個數,其中每個數字的範圍滿足:a[i]的絕對值小於等於4。
輸出
每組資料輸出1行,為最大的乘積。
樣例輸入
1
5 5
1 2 3 4 2
樣例輸出
48
將陣列進行排序,假設指定從前往後是正序,相反為逆序,然後比較正序前兩個數的乘積和逆序最後兩個數的乘積,如果逆序乘積較大,則ans*逆序的最後的一個數,但如果正序較大,則ans*正序的這兩個數乘積,這是因為可能是兩個負數相乘的結果
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int T = in.nextInt();
while(T-->0) {
int n = in.nextInt();
int m = in.nextInt();
int[] a = new int[n+5];
for(int i=0;i<n;i++)
a[i] = in.nextInt();
Arrays.sort(a,0,n);
int ans = 1;
int i=0;
int j=n-1;
if(n==1) {
System.out.println(a[0]);
continue;
}
while(i<=j && m>0) {
if(j==0) {
ans*=a[j];
break;
}
int s1 = a[i]*a[i+1];
int s2 = a[j]*a[j-1];
if(s1>=s2 && m>=2) {
ans*=s1;
i+=2;
m-=2;
}else {
ans*=a[j];
j--;
m--;
}
}
System.out.println(ans);
}
}
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define IO ios::sync_with_stdio(false);\
cin.tie(0);\
cout.tie(0);
const int maxn = 1e5+7;
int a[maxn];
int T;
int n,m;
int main()
{
IO;
cin>>T;
while(T--)
{
cin>>n>>m;
for(int i=0; i<n; i++)
cin>>a[i];
sort(a,a+n);
int i=0,j=n-1;
ll ans=1;
while(j>=i)
{
if(m==0) break;
ll mark1=a[i]*a[i+1];
ll mark2=a[j]*a[j-1];
if(mark1>=mark2&&m>1)
{
ans*=mark1;
i+=2;
m-=2;
}
else
{
ans*=a[j];
j--;
m--;
}
}
cout<<ans<<endl;
}
return 0;
}
---------------------
作者:so_so_y
來源:CSDN
原文:https://blog.csdn.net/so_so_y/article/details/79795642
版權宣告:本文為博主原創文章,轉載請附上博文連結!
相關文章
- [藍橋杯][演算法提高VIP]尤拉函式演算法函式
- [藍橋杯][演算法提高VIP]超級瑪麗演算法
- [藍橋杯][演算法提高VIP]大數加法演算法
- [藍橋杯][演算法提高VIP]奪寶奇兵 dp演算法
- [藍橋杯][演算法提高VIP]分蘋果 線段樹演算法蘋果
- (Day9)演算法復健運動for藍橋杯-雙指標演算法指標
- 題目 1501: [藍橋杯][演算法提高VIP]分蘋果演算法蘋果
- [藍橋杯][基礎練習VIP]矩形面積交
- 藍橋杯演算法提高——字串匹配(Java)演算法字串匹配Java
- 藍橋杯 演算法提高 字串壓縮演算法字串
- [藍橋杯][演算法訓練VIP]方格取數演算法
- [Java] 藍橋杯ADV-194 演算法提高 盾神與積木遊戲Java演算法遊戲
- 藍橋杯 -- 演算法提高 身份證號碼升級演算法
- 藍橋杯 演算法提高 拿糖果(完全揹包dp)演算法
- [藍橋杯][演算法提高VIP]上帝造題五分鐘 (線段樹+區間最小值)演算法
- lc 763.劃分字母區間(字串,雙指標)【***貪心演算法】字串指標演算法
- [Java] 藍橋杯ADV-202 演算法提高 最長公共子序列Java演算法
- Java實現 藍橋杯 演算法提高 八數碼(BFS)Java演算法
- 藍橋杯-遞增三元組(三種解法,二分, 雙指標, 字首和)指標
- 藍橋杯—演算法訓練演算法
- 藍橋杯--演算法訓練演算法
- 藍橋杯 排序排序
- [Java] 藍橋杯ADV-203 演算法提高 8皇后·改Java演算法
- 藍橋杯 演算法提高 P0102(Java解題)演算法Java
- 藍橋杯_演算法提高_身份證升級(簡單字元處理)演算法字元
- 問題 1462: [藍橋杯][基礎練習VIP]Huffuman樹
- 藍橋杯-子 2023 / 雙子數
- [Java] 藍橋杯ADV-213 演算法提高 3-2求存款Java演算法
- 2016藍橋杯演算法提高——身份證號碼升級演算法
- 藍橋杯-N皇后
- 藍橋杯真題
- 發現一個可以練習藍橋杯VIP題目的網址
- [Java] 藍橋杯ADV-185 演算法提高 五次方數Java演算法
- [Java] 藍橋杯ADV-147 演算法提高 學霸的迷宮Java演算法
- 藍橋杯 (java)演算法訓練 數對Java演算法
- 演算法訓練 字首表示式 (藍橋杯)演算法
- 藍橋杯年號字串字串
- 藍橋杯-帶分數