问题 1936: [蓝桥杯][算法提高VIP]最大乘积

问题 1936: [蓝桥杯][算法提高VIP]最大乘积

时间限制: 1Sec 内存限制: 128MB 提交: 77 解决: 16

题目描述
对于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
提示
来源
 
 
 
 
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstdlib>
 5 #include <cstring>
 6 #include <string>
 7 #include <deque>
 8 #include <vector>
 9 #include <set>
10 using namespace std;
11 #define ll long long
12 const int N= 5e3+1000;
13 #define P pair<int,int>
14 ll n,k,a[N];
15 int t;
16 int main()
17 {
18 scanf("%d",&t);
19 while(t--)
20 {
21 scanf("%lld%lld",&n,&k);
22 for(ll i=0;i<n;i++) scanf("%lld",&a[i]);
23 sort(a,a+n);
24 ll ans=1;
25 ll i,j;
26 for(i=n-1,j=0;k>0;){
27 if(k>=2){
28 ll ans1 = a[i]*a[i-1];
29 ll ans2 = a[j]*a[j+1];
30 if(ans1>=ans2){
31 ans*=a[i];
32 k--;
33 i--;
34 }
35 else{
36 ans*=ans2;
37 j+=2;
38 k-=2;
39 }
40 }
41 else{
42 ans*=a[i];
43 k--;
44 }
45 }
46 printf("%lld\n",ans);
47 }
48 return 0;
49 }

猜你喜欢

转载自www.cnblogs.com/tingtin/p/10574482.html