zoukankan      html  css  js  c++  java
  • 问题 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
    ",ans);
    47 }
    48 return 0;
    49 }
  • 相关阅读:
    53. Maximum Subarray
    64. Minimum Path Sum
    28. Implement strStr()
    26. Remove Duplicates from Sorted Array
    21. Merge Two Sorted Lists
    14. Longest Common Prefix
    7. Reverse Integer
    412. Fizz Buzz
    linux_修改域名(centos)
    linux_redis常用数据类型操作
  • 原文地址:https://www.cnblogs.com/tingtin/p/10574482.html
Copyright © 2011-2022 走看看