第九届蓝桥杯省赛 C++ B组 - 乘积最大

news2024/11/14 13:58:06

✍个人博客:https://blog.csdn.net/Newin2020?spm=1011.2415.3001.5343
📚专栏地址:蓝桥杯题解集合
📝原题地址:乘积最大
📣专栏定位:为想参加蓝桥杯的小伙伴整理常考算法题解,祝大家都能取得理想成绩!
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

问题描述

给定 N 个整数 A1,A2,…AN。

请你从中选出 K 个数,使其乘积最大。

请你求出最大的乘积,由于乘积可能超出整型范围,你只需输出乘积除以 1000000009 的余数。

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

输入格式

第一行包含两个整数 N 和 K。

以下 N 行每行一个整数 Ai。

输出格式

输出一个整数,表示答案。

数据范围

1≤K≤N≤105,
−105≤Ai≤105

输入样例1:

5 3
-100000
-10000
2
100000
10000

输出样例1:

999100009

输入样例2:

5 3
-100000
-100000
-2
-100000
-100000

输出样例2:

-999999829

思路

直接上结论,我们需要先对所有数字进行排序, 然后再进行判断:

情况取法结果
k==n所有数都选由序列而定
k<n 且 k 是偶数选取负数的个数必须为偶数个且绝对值最大,选取正数的个数也是偶数个且绝对值最大必然为非负数
k<n 且 k 是奇数如果所有数都是负数,则选取负数绝对值最小的数;如果至少存在一个非负数,则选上一个最大的非负数,这样就还剩 k-1 个数要选且 k-1 为偶数,变为上面 k 为偶数的情况第一种情况结果一定为负数,第二种情况结果一定为非负数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AtIXRwyx-1674523479213)(AcWing 蓝桥杯辅导.assets/image-20221227154009735.png)]

所以我们可以用双指针算法,具体思路如下:

  1. 先对所有数进行排序。

  2. 如果 k 为奇数,则需要将其变为偶数的情况再进行操作,同时用 sign 记录最终结果是正数还是负数,上面有提到过如果 k 是奇数需要分情况讨论,当所有数都是负数时,结果一定为负;当至少有一个数为正时,结果一定为正。所以我们只需取数组的最后一个数,判断其是否为负数即可。

  3. 此时,就可以按照当 k<nk 为偶数的情况进行操作,只不过要根据 sign 的正负来进行选取。

    设置一个左指针和一个右指针分别指向数组开头和结尾,然后分别取两个数相乘进行比较,由于此时的 k 为偶数,不会出现正负数落单的情况。

    如果 sign 为正数,则选取相乘结果更小的;如果 sign 为负数,则选取相乘结果更大的,因为结果一定为负,则需要使相乘的绝对值越小越好,这样负数的绝对值越小,结果就越大。

  4. 输出最终结果。

代码

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
const int N = 100010, mod = 1000000009;
int a[N];
int n, k;

int main()
{
    scanf("%d%d", &n, &k);
    for (int i = 0; i < n; i++)    scanf("%d", &a[i]);
    sort(a, a + n);    //对所有数进行排序

    //双指针算法
    int l = 0, r = n - 1, res = 1;
    int sign = 1;
    if (k % 2) //k为奇数则需要转化成偶数
    {
        res = a[r--];
        k--;
        if (res < 0)   sign = -1;
    }
    while (k)
    {
        LL x = (LL)a[l] * a[l + 1], y = (LL)a[r] * a[r - 1];
        if (x * sign > y * sign)   //sign为正数,选值更大的
        {
            res = x % mod * res % mod;
            l += 2;
        }
        else    //sign为负数,选值更小的
        {
            res = y % mod * res % mod;
            r -= 2;
        }
        k -= 2;
    }

    //输出结果
    printf("%d\n", res);

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/177682.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Thread的join()方法的作用

文章目录官方文档对join()的解释&#xff1a;结合实例解释官方文档对join()的解释&#xff1a; Thread.join() method javadocs&#xff08;点击跳转&#xff09; join() Waits for this thread to die. 线程类的 join()方法将等待子线程完成&#xff0c;然后继续当前线程。j…

【Python】常见的时间操作(时间区间、时间相加减、指定年月天数等。。。

前言 记录在Python中使用的时间操作&#xff0c;方便以后查找。 在使用Python中&#xff0c;常会遇到关于时间的操作。 虽说每次都能借助搜索引擎找到解决的方法&#xff0c;但好记性不如烂笔头&#xff0c;遂有此文。 暂时记录了笔者所使用过的Python关于时间的操作&#xff0…

人世正道沧桑,她亦奋力向前 --读《李清照传》有感

有一次陪小孩晨读&#xff0c;朗诵诗歌&#xff0c;读到了李清照的《夏日绝句》&#xff1a;“生当作人杰&#xff0c;死亦为鬼雄。至今思项羽&#xff0c;不肯过江东”。这首诗是1129年&#xff0c;李清照在芜湖的乌江县触景生情&#xff0c;有感而作的。这首诗写得大气磅礴&a…

JQuery总结(一)

JQUERY概述&#xff1a; JQUERY和DOM相互转换&#xff1a; 基础选择器&#xff1a; 筛选选择器&#xff1a; show hide toggle方法 jQuery hover方法 jQuery stop()方法 例子&#xff1a;显示、隐藏、切换 button{/* 随着字体大小变化,button跟着变化大小 */font-size: 20px;ba…

【Git】国内代码托管中心码云(Gitee)

9、国内代码托管中心码云(Gitee) 9.1、简介 众所周知&#xff0c;GitHub 服务器在国外&#xff0c;使用 GitHub 作为项目托管网站&#xff0c;如果网速不好的话&#xff0c;严重影响使用体验&#xff0c;甚至会出现登录不上的情况。针对这个情况&#xff0c;大家也可以使用国…

边界框回归 Bounding-Box Regression

文章目录边界框回归&#xff08;Bounding-Box Regression&#xff09;一、边界框回归简介二、边界框回归细节三、相关问题思考1. 为什么使用相对坐标差?2. 为什么宽高比要取对数?3. 为什么IoU较大时边界框回归可视为线性变换&#xff1f;边界框回归&#xff08;Bounding-Box …

协调中心性能大对比:zookeeper是如何解决负载均衡问题的

作为分布式系统的一个长久话题&#xff0c;协调中心的性能是一个很有意思的突破口。 作为java的分布式协调中心&#xff0c;常见的有zookeeper&#xff0c;redis &#xff0c;memcache等全局性功能的组件&#xff0c;也有MySQL&#xff0c;mongoDB之类的数据库形持久存储。 两…

PyCharm无法打开,提示Internal error错误。

安装LeetCode插件后&#xff0c;重新打开PyCharm后&#xff0c;出现该错误。 删除安装目录下的 plugins 文件夹后&#xff0c;重新打开后&#xff0c;又出现该错误。 重新把回收站的文件夹恢复后&#xff0c;再次打开还是之前那个错误。 尝试了 cmd ,powershell&#xff0c;管…

Python Flask构建微信小程序订餐系统 (五)

🔥 微信小程序登录态 🔥 所谓登录态,就是程序在运行时,能够识别当前用户,能够证明自己的唯一性且合法。 WEB服务器通过浏览器携带的cookie获取session来判断是否是同一用户(或浏览器);Restful服务通过客户端传过来唯一ID,来识别调用用户。 维护登录态的原因 有自身…

行为型模式-模板方法模式

1.概述 在面向对象程序设计过程中&#xff0c;程序员常常会遇到这种情况&#xff1a;设计一个系统时知道了算法所需的关键步骤&#xff0c;而且确定了这些步骤的执行顺序&#xff0c;但某些步骤的具体实现还未知&#xff0c;或者说某些步骤的实现与具体的环境相关。 例如&…

机器学习(五):机器学习算法分类

文章目录 机器学习算法分类 一、监督学习 1、回归问题 2、分类问题 二、无监督学习 三、半监督学习 四、强化学习 机器学习算法分类 根据数据集组成不同&#xff0c;可以把机器学习算法分为&#xff1a; 监督学习无监督学习半监督学习强化学习一、监督学习 定义&…

Python初学者看过来啊,老油条来复习

嗨嗨嗨&#xff0c;我又又又又来了 目录 一、Python常用的基本语句 1、format字符串格式化 2、连接字符串 3、if...else条件语句 4、for...in、while循环语句 5、import导入 2.详细介绍 对于初学者来说&#xff0c;想要学好Python语言&#xff0c;必须从最基本的知识开…

为了方便项目打包,我用Node写了个git-tag工具

目录 前言 实现过程 起步 npm全局命令 功能实现 功能验证 代码发布 写在最后 前言 在使用git执行打包操作时&#xff0c;我们常常会根据场景在tag中增加一些标识。 以基准版本为1.0.0为例&#xff1a;软件开发初期可以定义1.0.0-alpha.0&#xff0c;开发阶段是1.0.0-b…

【面试克星】【公式少代码少话多】Vins-Mono预积分相关知识点总结与概述

前言 Vins-Mono预积分相关的公式和代码可以在各个博客中找到。本文将充当一个帮助大家快速理解预积分、中值积分相关概述的角色&#xff0c;带大家理解代码&#xff0c;应对面试。 下面会分成三步&#xff0c;来帮助大家充分理解这个过程。步骤是按照顺序来写的。 中值积分和…

学习MapStruct

概述 MapStruct是一个Java注释处理器&#xff0c;用于生成类型安全的bean映射类。 您要做的就是定义一个映射器接口&#xff0c;该接口声明任何必需的映射方法。在编译期间&#xff0c;MapStruct将生成此接口的实现。此实现使用简单的Java方法调用在源对象和目标对象之间进行映…

<<零入门容器云网络实战>>技术专栏之文章目录

建议: 1、资源 零入门容器云网络实战 链接: https://pan.baidu.com/s/1nPLRkAwjItAHmtEU2T1F4g 提取码: rrpd 2、技术沟通渠道 342498897 3、字体颜色说明 绿色字体&#xff0c; 表示已经发表&#xff0c;可以观看 灰色字体&#xff0c; 表示未发表 4、专栏介绍 1 <<…

【小知识点】如何在 git 中取消 __pycache__ 文件

文章目录如何在 git 中取消 **pycache** 文件CryptographyDeprecationWarning 异常如何在 git 中取消 pycache 文件 如果使用 PyCharm 运行代码&#xff0c;会在 Python 脚本所在目录生成 __pycache__ &#xff0c;每次提交到 git 都会包含该目录&#xff0c;本篇博客我们要将其…

插入排序算法的实现和优化~

插入排序的基本思想&#xff1a; 在一个已排好序的记录子集的基础上&#xff0c;每一步将下一个待排序的记录有序插入到已排好序的记录子集中&#xff0c;直到将所有待排记录全部插入为止 直接插入排序&#xff1a; 直接插入排序是一种最基本的插入排序方法&#xff0c;元素…

离线召回与排序介绍

3.3 离线召回与排序介绍 学习目标 目标 了解召回排序作用知道头条推荐召回排序设计应用 无 3.3.1 召回与排序介绍 召回&#xff1a;从海量文章数据中得到若干候选文章召回集合(数量较多) 排序&#xff1a;从召回集合中读取推荐文章&#xff0c;构建样本特征进行排序过滤筛选…

【SpringCloud21】面试题雪花算法

目录1. 问题2.ID生成规则部分硬性要求3.ID号生成系统的可用性要求4.一般通用方案4.1UUID4. 数据库自增主键5. 基于Redis生成全局id策略6. snowflake6.1 概述6.2 结构6.3 源码6.4 工程落地经验6.4.1 糊涂工具包6.4.2 springboot整合雪花算法1.POM2.核心代码IdGeneratorSnowflake…