2018年 第九届蓝桥杯 C++省赛B组 第十题:乘积最大

该博客介绍了第九届蓝桥杯C++省赛B组第十题,题目要求从N个整数中选出K个数使乘积最大,输出乘积对1000000009的余数。博主分享了解题思路,包括针对不同数据情况的处理方法,并提供了代码实现。此外,博主还提到了在编程过程中遇到的问题和解决办法,以及对vector容器的使用心得。
摘要由CSDN通过智能技术生成

[乘积最大]

题目

 

话8多说先上题目:

给定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

思路

这道题之前是在另外一个博文上看到的,当时没有标明输入的数据的范围,然后看了一下是最后一道题,还以为得用大数来做。后来在蓝桥官网上面去下载了原题的txt文档,才发现输入的整数是有数据范围的,这样思考起来就简单多了。题目当中给定的数据范围为  -100000 <= Ai <= 100000  ,这样输入的数据大概可以分为一下几种情况来考虑:

  1. 输入的数据全为正数,没有负数和0,这样直接将全部数据由大到小排序,取前K个数据相乘,使用  long long outNum储存相乘的结果,注意这里相乘结果可能会溢出,因此每次相乘后都要对1000000009取余; 
  2. 输入的数据含有正数,没有负数,含有0。与前面一样,先进行排序,取前K个数相乘取余,这种情况可以和第一种情况归为一类;
  3. 输入的数据没有正数,含有负数,没有0。相同的,先进行排序,若K为偶数:从数组的最后向前取数;若为奇数,相乘一定为负数,则从数组的开头开始取数;
  4. 输入的数据中含有负数和0,没有正数,若K为奇数:直接输出为0;若K为偶数:从数组的末尾向前取;
  5. 输入的数据中含有正数和负数,将数组按照绝对值由大到小排序,取前K个数据,并统计前K个数据中负数的个数。若负数的个数为偶数:直接从前面开始取数。若负数的个数为奇数࿱
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2018年第九届C/C++ A组蓝桥杯主要包含编程和选择两部分。编程考察了学生对C/C++语言的掌握以及解决实际问的能力,选择则涵盖了计算机科学与技术的基础知识。 编程中有一道较难的目是“最短路径问”。该给出了一个有向图,要求求解出从起点到终点的最短路径。这道需要学生运用图论中的最短路径算法,比如迪杰斯特拉算法或贝尔曼-福特算法来解决,需要高度的编程能力和算法思维能力。 除了编程外,选择考察了计算机科学与技术的基础知识,包括数据结构、算法、操作系统、计算机网络等方面。例如,有一道关于排序算法的选择,要求学生判断给定的排序算法是否满足时间复杂度为O(nlogn)的条件,需要对常见的排序算法,如快速排序、归并排序等进行了解和分析。 蓝桥杯是一个针对大学生的计算机比,旨在提高学生的编程能力和解决实际问的能力。每年都会有数以万计的大学生参加,竞争十分激烈。参加蓝桥杯不仅可以提升自己的编程技术水平,还有机会获得奖金和荣誉,对以后的学习和就业都有很大的帮助。 总之,2018年第九届C/C++ A组蓝桥杯涵盖了C/C++语言的应用和计算机科学与技术的基础知识。通过参加这样的比,可以提高自己的编程能力,同时也为今后的学习和发展打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值