2018第九届蓝桥杯C++省赛B组[最新题解汇总]

标题:乘积最大

给定N个整数A1, A2, ... AN。请你从中选出K个数,使其乘积最大。  
请你求出最大的乘积,由于乘积可能超出整型范围,你只需输出乘积除以1000000009的余数。

注意,如果X<0, 我们定义X除以1000000009的余数是负(-X)除以1000000009的余数。
即:0-((0-x) % 1000000009)

【输入格式】
第一行包含两个整数N和K。  
以下N行每行一个整数Ai。

对于40%的数据,1 <= K <= N <= 100  
对于60%的数据,1 <= K <= 1000  
对于100%的数据,1 <= K <= N <= 100000  -100000 <= Ai <= 100000

【输出格式】
一个整数,表示答案。

【输入样例】
5 3 
-100000   
-10000   
2   
100000  
10000

【输出样例】
999100009

再例如:
【输入样例】
5 3 
-100000   
-100000   
-2   
-100000  
-100000

【输出样例】
-999999829

资源约定:
峰值内存消耗(含虚拟机) < 256M

CPU消耗  < 1000ms

思路:这题我觉得贪心分情况即可:先按照绝对值从大到小排序

①假如选的k个数中必定有0,则结果为0

②假如都是负数,此时若k为偶数,则选前k个数即可,若k为奇数,则只能从小的开始选k个数

③假如都为正数,选前k个数即可

④假如正负都有,此时,若前k个数有偶数个负数,则选前k个数即可

若前k个数有奇数个负数,则我们看看能不能从后面选一个大正数跟前面的小负数做交换,或者从后面选一个大负数跟前面的小正数做交换,二者取结果大的.

此时分完所有情况若结果还为负数,我们看看输入是否有0,有零结果即为0,否则就只能输出这个负数了.

代码:

#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define mod 1000000009
using namespace std;
typedef long long ll;
const int maxn = 1e6+5;
const double esp = 1e-7;
const int ff = 0x3f3f3f3f;
map<int,int>::iterator it;struct node
{ll x;int f;
}a[maxn];int n,k;bool cmp(node x,node y)
{return x.x> y.x;
}ll solve(int o)
{ll ans = 1;int cnt = 0;if(o == 0)//从前往后乘 {for(int i = 1;i<= k;i++){ans = (ans*a[i].x)%mod;if(a[i].f == 1)cnt++;}}else//从后往前乘 {for(int i = n;i> n-k;i--){ans = (ans*a[i].x)%mod;if(a[i].f == 1)cnt++;}}if(cnt&1)return ans*(-1);return ans;
}int main()
{cin>>n>>k;int flag = 0;int cnt = 0;for(int i = 1;i<= n;i++){scanf("%lld",&a[i].x);if(a[i].x< 0){a[i].f = 1;a[i].x = -a[i].x;cnt++;}else if(a[i].x> 0)a[i].f = 0;else{i--;n--;//我们不记录0,0只做迫不得已的选择 flag = 1;}}sort(a+1,a+n+1,cmp);ll ans = 0;if(n< k)//如果必须选0 ans = 0;else if(cnt == n)//如果都为负数 {if(k&1)ans = solve(1);elseans = solve(0);}else if(cnt == 0)//如果都为正数 ans = solve(0);else{int tmp = 0;for(int i = 1;i<= k;i++)if(a[i].f == 1)tmp++;if(tmp%2 == 0)//如果前k大的数有偶数个负数 ans = solve(0);else{ans = -1;//将其设置为负数 //尝试将前k个里面一个绝对值最小负数和后面最大正数交换 int p = -1,q = -1;for(int i = k+1;i<= n;i++)if(a[i].f == 0){q = i;break;}for(int i = k;i>= 1;i--)if(a[i].f == 1){p = i;break;}if(p!= -1&&q!= -1){swap(a[p],a[q]);ans = solve(0);swap(a[p],a[q]);}//尝试将前k个里面一个最小正数和后面绝对值最大正数交换p = -1,q = -1;for(int i = k+1;i<= n;i++)if(a[i].f == 1){q = i;break;}for(int i = k;i>= 1;i--)if(a[i].f == 0){p = i;break;}if(p!= -1&&q!= -1){swap(a[p],a[q]);ans = max(ans,solve(0));swap(a[p],a[q]);}//假如结果仍然小于0,我们只能尝试从最后往前乘了 if(ans< 0)ans = solve(1); }}if(ans< 0)if(flag)//这时候0派上用场了 {cout<<0<<endl;return 0;}cout<<ans<<endl;return 0;
}

2018省赛第九届蓝桥杯真题C语言B组第十题题解 乘积最大相关推荐

  1. 2018省赛第九届蓝桥杯真题C语言B组第五题题解 快速排序

    2018第九届蓝桥杯C++省赛B组[最新题解汇总] 标题:快速排序. 以下代码可以从数组a[]中找出第k小的元素. 它使用了类似快速排序中的分治算法,期望时间复杂度是O(N)的. 请仔细阅读分析源码, ...

  2. 2018省赛第九届蓝桥杯真题C语言B第四题题解 测试次数

    2018第九届蓝桥杯C++省赛B组[最新题解汇总] 标题:测试次数 x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机. 各大厂商也就纷纷推出各种耐摔型手机.x星球的质监局规定了手机 ...

  3. 2018省赛第九届蓝桥杯真题C语言B组第九题题解 全球变暖

    2018第九届蓝桥杯C++省赛B组[最新题解汇总] 标题:全球变暖 你有一张某海域NxN像素的照片,"."表示海洋."#"表示陆地,如下所示: ....... ...

  4. 2018省赛第九届蓝桥杯真题C语言B组第八题题解 日志统计

    2018第九届蓝桥杯C++省赛B组[最新题解汇总] 标题:日志统计 小明维护着一个程序员论坛.现在他收集了一份"点赞"日志,日志共有N行.其中每一行的格式是: ts id 表示在t ...

  5. 2018省赛第九届蓝桥杯真题C语言B组第六题题解 递增三元组

    2018第九届蓝桥杯C++省赛B组[最新题解汇总] 标题:递增三元组 给定三个整数数组 A = [A1, A2, ... AN],  B = [B1, B2, ... BN],  C = [C1, C ...

  6. 第九届蓝桥杯真题解析JavaC组

    第九届蓝桥杯真题解析JavaC组 文章目录 ***第九届蓝桥杯真题解析JavaC组*** 前言 A.哪天回家 B.猴子分香蕉 C.字母阵列 D.第几个幸运数 E.书号验证 F.打印大X G.缩位求和 ...

  7. 2018年第九届蓝桥杯真题解析 | 日志统计【Python】

    问题描述 小明维护着一个程序员论坛.现在他收集了一份"点赞"日志,日志共有 N 行.其中每一行的格式是: ts id 表示在 ts 时刻编号 id 的帖子收到一个"赞&q ...

  8. 2018年第九届蓝桥杯真题解析 | 星期一【Python】

    问题描述 整个 2020 世纪(1901 年 1 月 1 日至 2000年 12 月 31 日之间),一共有多少个星期一? 个人思路 使用datetime模块 常见的datetime函数 1.S = ...

  9. 2015年第六届蓝桥杯C/C++程序设计本科B组决赛第二题

    http://www.docin.com/p-506195687.html 这样算不算写了一道题.... 完美正方形 如果一些边长互不相同的正方形,可以恰好拼出一个更大的正方形,则称其为完美正方形. ...

最新文章

  1. 无法访问您试图使用的功能所在的网络位置
  2. 批量修改文件夹下图片名称(Python)
  3. 使用自连接、for xml path('')和stuff合并显示多行数据到一行中(转)
  4. 《数据结构与算法分析:C语言描述》复习——第十章“算法设计技巧”——Minimax策略...
  5. 澳大利亚科学家研发智能袜子SoPhy,帮助患者进行理疗
  6. 局域网常用的DOS命令查IP
  7. 计算机发展史的十大成就,2019中国十大科技成就:数个“第一”创造历史
  8. python程序设计实践教程陈东_Python
  9. redhat server 5.3内核升极2.6.18 升级到 3.5 装systemtap 原创
  10. 容器编排技术 -- Kubernetes kubectl rollout history 命令详解
  11. zabbix 的安装
  12. python 如何检验数据正态分布_小样本数据的正态性检验用python怎么写?
  13. C#EasyHook例子C# Hook 指定进程C#注入指定进程 z
  14. SpringBoot项目启动报错
  15. 基于ffmpeg+SDL的加密视频播放器的开发(一)
  16. rdcman汉化_Remote Desktop Organizer – 管理组织远程桌面 - 小众软件
  17. c语言 close,C++ close()关闭文件方法详解
  18. 15个好用的百度网盘搜索引擎
  19. 【OKR目标管理】价值分析
  20. 基于JavaWeb实现的问卷调查系统

热门文章

  1. 他励直流电动机的制动
  2. 震撼人心的战争类背景音乐
  3. IIS配置webp后缀文件
  4. 物联网之散射通信应用
  5. 全景制作平台,krpano全景图下载并快速关联漫游
  6. android显示地图代码,Android Studio之高德地图实现定位和3D地图显示(示例代码)
  7. 读取图片文件到剪贴板时的html格式
  8. celery使用post方法解决方案
  9. 教你学Java | 带你学习Java多线程(续:创建线程的其他方式与activeCount方法的浅谈)
  10. 【PyTorch】偏置项 bias 与 Batch-Normalize