1712: 最大乘积
时间限制: 1 Sec 内存限制: 128 MB

[提交][状态][讨论版]
题目描述
对于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.直接贪心。

序列中可能有负数。
明确一点,如果是负数,必须一次取一对负数,这样保证每次取的尽可能是正数。

因为要使乘积最大,那么先对原序列排个序。
每次取前两个和后两个,分别算出它们的乘积,比较它们哪对乘积更大,
只要需要的序列个数大于两个,
那么就取乘积更大的一对,取了的相当于删掉了,
重复上述操作,直到需要的序列个数小于2,
如果此时还需要,
那么最后肯定是取当前剩下序列中最大的那一个
(即如果之前排的升序,即剩下序列中最后一个)

2.直接dfs暴搜。
加一个可行性剪枝。
即当前位置之后(包括当前位置)剩余元素个数小于还需要的个元素个数直接return
*/
way1:

#include <bits/stdc++.h>
using namespace std;
int main()
{ios::sync_with_stdio(false);int t;cin>>t;while(t--){int n,m;cin>>n>>m;int a[n+2];int temp = 1;for(int i  = 1; i <= n; i++){cin>>a[i];}sort(a+1,a+n+1);int ans = 1;int pos1 = 2,pos2 = n-1;while(m >= 2){if(a[pos1]*a[pos1-1] >= a[pos2]*a[pos2+1]){ans *= a[pos1] * a[pos1-1] ;pos1 += 2;}else{ans *= a[pos2] * a[pos2+1];pos2 -= 2;}m -= 2;}if(m){ans *= a[pos2+1];}cout<<ans<<endl;}return 0;
}

way2:

#include <bits/stdc++.h>
using namespace std;
int n,m,ans;
int a[20];
bool vis[20];
void dfs(int s,int cnt,int sum)
{if(n-s+1 < m-cnt)return;if(cnt == m){ans = max(ans,sum);return;}for(int i = s; i <= n; i++){if(!vis[i]){vis[i] = true;dfs(i+1,cnt+1,sum*a[i]);//递归起始位置不要写成了s+1,而是i+1!!!!vis[i] = false;}}
}
int main()
{int t;scanf("%d",&t);while(t--){scanf("%d %d",&n,&m);ans = -(1<<30);memset(vis,false,sizeof(vis));for(int i = 1; i <= n; i++){scanf("%d",&a[i]);}dfs(1,0,1);printf("%d\n",ans);}return 0;
}

1712: 最大乘积(贪心/dfs)相关推荐

  1. Solve The Maze CodeForces - 1365D(贪心+dfs)

    Vivek has encountered a problem. He has a maze that can be represented as an n×m grid. Each of the g ...

  2. USACO2.1【bfs,排序,贪心,dfs,位运算】

    前言 开始刷USACO的题了. 正题 刷前必备技能:OI常识,bfs,dfs,位运算,基础贪心,快速排序. T1:城堡 TheCastleThe CastleTheCastle 评测记录: https ...

  3. bzoj3252攻略 贪心+dfs序+线段树

    题目链接:戳这里 3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 605  Solved: 255 [Submit][Status] ...

  4. 最大乘积|贪心算法|FOJ1698|TYVJ3024

    [题目链接]TYVJ3024 最大乘积 [问题描述] 一个正整数一般可以分为几个互不相同的自然数的和,如3=1+2,4=1+3,5=1+4=2+3,6=1+5=2+4,-.现在你的任务是将指定的正整数 ...

  5. 贪心 最大乘积 java_最大乘积|贪心算法|FOJ1698|TYVJ3024

    最大乘积 [问题描述] 一个正整数一般可以分为几个互不相同的自然数的和,如3=1+2,4=1+3,5=1+4=2+3,6=1+5=2+4,-.现在你的任务是将指定的正整数n分解成若干个互不相同的自然数 ...

  6. ECNU 3306. 有钱人买钻石 (贪心+dfs)

    3306. 有钱人买钻石 题面统计数据讨论 单点时限: 2.0 sec 内存限制: 256 MB 有一个有钱人,他身上带了好多硬币.但是这么多硬币由不方便带,所以他决定要用这些硬币去买钻石. 有趣的是 ...

  7. 搜索 —— 深度优先搜索(DFS)

    [概述] 深度优先搜索,是从初始状态起,利用一定的规则生成搜索树,寻找下一层任一个结点,检查是否出现目标状态,若未出现,以此状态利用规则生成再下一层任一个结点,再检查,重复过程一直到叶节点(即不能再生 ...

  8. 【bzoj1217】[HNOI2003]消防局的设立 贪心

    [HNOI2003]消防局的设立  Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能 ...

  9. LeetCode 700题 题解答案集合 Python

    2019.5.12更新至题号796,目前共有265题. 2019.5.26更新至题号72, 目前共有347题. 2019.6.16更新至题号70,目前共有382题. 2019.7.7更新至题号5120 ...

最新文章

  1. Mozilla网站安全分析工具Observatory已发布
  2. WinCE BSP的BIB文件介绍
  3. webrtc 源码结构
  4. 【Java】Fibonacci数列编程实现
  5. Logistic Regression 之 Sigmoid
  6. C++11新特性(3)
  7. Notification使用详解之四:由后台服务向Activity发送进度信息
  8. 机器人学导论,课后习题答案。
  9. java分页 添加序号_java 分页
  10. ezd格式文件怎么打开_支持EZD文本格式的软件,想要打开DXF文本格式,怎样把它改成EZD文本格式...
  11. 数字化转型提出新要求 新华三IT基础架构如何随需而变?
  12. 【教程】如何批量制作线刷包和卡刷包
  13. 第七次人口普查数据可视化分析实战——基于pyecharts(含数据和源码)
  14. 抖音GIF表情包制作教程 如何制作QQ动态表情包
  15. 数字基础设施可视化管理,任重而道远
  16. 服务器3389信息,服务器3389远程记录查看
  17. Kafka安全认证 SASL/PLAINTEXT,账号密码认证
  18. 品达通用_9. pd-tools-log
  19. 战神遗迹服务器未响应怎么回事,战神遗迹怎么进不去 黑屏闪退解决方法介绍...
  20. python绘制布林带

热门文章

  1. 联想p720装系统_分享联想ThinkPad X1 Carbon笔记本最稳的重装WIN10系统方法
  2. 大学校运会计算机专业方阵,校运动会方阵策划案
  3. python 类的内置方法_Python 类的常用内置方法
  4. pandas parse_data出现异常时,自动跳过
  5. centOS 安装mysql5.6
  6. 再见了Python,Tableau数分工具确实牛逼!
  7. 值得学习练手的22个Python迷你程序(附代码)
  8. 数据可视化,必须注意的30个小技巧!
  9. git拉取tag_不给队友拖后腿!团队开发中 Git 最佳实践
  10. ajax 微信code获取_ajax 实现微信网页授权登录的方法