[藍橋杯][演算法提高VIP]最大乘積 貪心 雙指標

一葉之修發表於2019-03-06

藍橋杯歷年真題題目及題解目錄彙總 

 

題目描述

對於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 
版權宣告:本文為博主原創文章,轉載請附上博文連結!

 

相關文章