蓝桥杯 算法提高 最大乘积
2016-01-19 20:18
387 查看
问题描述
对于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
对于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
#include<stdio.h> #include<stdlib.h> int cmp(const void *a,const void *b) { return (*(int *)a-*(int *)b); } int a[20]; int main() { int t; int n,m; int i,j; int now1,now2; long long sum; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=0;i<n;i++) scanf("%d",&a[i]); qsort(a,n,sizeof(a[0]),cmp); sum=1; for(i=n-1,j=0;i>=j&&m!=0;i--) { now1=a[i]*a[i-1]; now2=a[j]*a[j+1]; if(now1<=now2&&m>=2) { sum*=now2; i++; j+=2; m-=2; } else { sum*=a[i]; m--; } } printf("%I64d\n",sum); } return 0; }
相关文章推荐
- 密码
- POJ3070 Fibonacci(矩阵快速幂)
- 松下蓄电池与UPS使用和维护
- C++的运算符重载
- MFC操作SQlite,打开数据库路径存在中文,解决方案
- android 4.0.3 设置时间无法更新到RTC
- foreach
- CSS的::selection使用方法
- Reactor模式
- 异步打开一个文件进行读取
- confluence安装
- POJ 3416 Sunscreen(贪心)
- 每个程序员需掌握的20个代码命名小贴士
- Single Number leetcode
- C++之智能指针(二)
- java 读取XML文件作为配置文件
- 视频采集处理之V4L2编程
- Android Studio导入GitHub第一个项目PullToRefresh
- leetcode 之valid anagram
- windows程序托盘图标以及消息提示--示例程序