[蓝桥杯 2018 省 B] 乘积最大-题解

devtools/2024/10/24 17:38:49/

[蓝桥杯 2018 省 B] 乘积最大

题目描述

给定 N N N 个整数 A 1 , A 2 , ⋯ , A N A_1, A_2,\cdots, A_N A1,A2,,AN。请你从中选出 K K K 个数,使其乘积最大。

请你求出最大的乘积,由于乘积可能超出整型范围,你只需输出乘积除以 1000000009 1000000009 1000000009(即 1 0 9 + 9 10^9+9 109+9)的余数。

注意,如果 X < 0 X<0 X<0, 我们定义 X X X 除以 1000000009 1000000009 1000000009 的余数是 0 − ( ( 0 − x ) m o d 1000000009 ) 0-((0-x)\bmod 1000000009) 0((0x)mod1000000009)

输入格式

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

以下 N N N 行每行一个整数 A i A_i Ai

输出格式

一个整数,表示答案。

样例 #1

样例输入 #1

5 3 
-100000   
-10000   
2   
100000  
10000

样例输出 #1

999100009

样例 #2

样例输入 #2

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

样例输出 #2

-999999829

提示

对于 40 % 40\% 40% 的数据, 1 ≤ K ≤ N ≤ 100 1\le K\le N\le 100 1KN100

对于 60 % 60\% 60% 的数据, 1 ≤ K ≤ 1000 1\le K \le 1000 1K1000

对于 100 % 100\% 100% 的数据, 1 ≤ K ≤ N ≤ 1 0 5 1\le K\le N\le 10^5 1KN105 − 1 0 5 ≤ A i ≤ 1 0 5 -10^5\le A_i\le 10^5 105Ai105


具体思路

这是一道关于乘积最大化的问题,题目要求从给定的整数中选出K个数,使它们的乘积最大,并将结果除以1000000009后取余数。

我们可以使用动态规划来解决这个问题。设dp[i][j]表示从前i个数中选取j个数乘积的最大值,那么状态转移方程可以表示为: d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i − 1 ] [ j − 1 ] ∗ A [ i ] ) dp[i][j] = max(dp[i-1][j], dp[i-1][j-1] * A[i]) dp[i][j]=max(dp[i1][j],dp[i1][j1]A[i])其中A[i]表示第i个数。

根据题目要求,如果乘积结果小于0,则需要计算其除以1000000009的余数。


下面是使用C++实现的代码:

#include<bits/stdc++.h>
#define int long long 
#define mod 1000000009
using namespace std;int n, k, a[100005], ans;signed main()
{cin >> n >> k;for (int i = 1; i <= n; i++) {cin >> a[i];}sort(a + 1, a + n + 1);ans = k & 1 ? a[n] : 1;n -= k & 1;k -= k & 1;int l = 1, r = n, f = ans < 0 ? -1 : 1;while (k) {int p = a[l] * a[l + 1], q = a[r] * a[r - 1]; if (p * f > q * f) { ans = (p % mod * ans) % mod;l += 2;} else {ans = (q % mod * ans) % mod;r -= 2;}k -= 2;}cout << ans << endl;return 0;
}

该代码使用二维数组dp来保存中间结果,时间复杂度为O(NK)。最终输出dp[N][K]即为所求的乘积最大值的余数。


http://www.ppmy.cn/devtools/128477.html

相关文章

编写Python 自动化安装openGauss 数据库方法和代码 (2)

不断调试&#xff0c;更新&#xff0c;你若有兴趣一起参与 #!/usr/bin/env python3 import os import subprocess import platform import re import socket # 1、检查操作系统版本 def check_system_version(): try: with open(/etc/os-release, r) as f: …

npm install node-sass安装失败

需求&#xff1a;搭建前端开发环境时&#xff0c;npm install报错&#xff0c;错误提示安装node_modules时&#xff0c;node-sass依赖包安装失败&#xff0c;网上找了好久解决方法&#xff0c;大家提示采用淘宝源等方式安装&#xff0c;都失败了了&#xff0c;尝试了很久终于找…

AWS账号的费用结构与使用指南

亚马逊网络服务&#xff08;AWS&#xff09;是全球领先的云计算平台&#xff0c;提供各种服务&#xff0c;包括计算、存储、数据库、人工智能等。对于许多新用户来说&#xff0c;在创建AWS账号时&#xff0c;常常会有一个疑问&#xff1a;AWS账号需要费用吗&#xff1f;我们九河…

Maven 的使用:在 IDEA 中配置 Maven 的超详细步骤

一、概述 记录时间 [2024-10-20] Maven 用来管理 Java 项目中的依赖。 为什么要进行 Maven 配置呢&#xff1f;IDEA 默认选择内置的 Maven 仓库&#xff0c;但是不好用。 本文所讲述的 Maven 配置可以说是超详细的&#xff01; 从下载 Maven 这个东西开始&#xff0c;修改它…

【数据结构】栈和队列经典题目

目录 1.有效的括号【链接】 代码实现 2.用队列实现栈【链接】 代码实现 3.用栈实现队列 ​编辑 代码实现 4.循环队列&#xff08;数组实现&#xff09;【链接】 代码实现 1.有效的括号【链接】 题目描述&#xff1a; 给定一个只包括 (&#xff0c;)&#xff0c;{&…

Ubuntu18.04:no module named ‘apt_pkg‘(python3.6升级为3.7要注意的事情)

这里写目录标题 没生效的尝试有用的解决附&#xff1a;升级方法 一直提示没有名叫apt_pkg的模块(no module named ‘apt_pkg’) 是python没装好&#xff1f;还是python没指向python3&#xff1f; 没生效的尝试 有用的解决 下面这个目录里&#xff0c;文件名带有36m的改为37m的…

mysql查询id不在列表中的记录

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…

Ruby 从入门到精通:学习之旅与资源推荐

一、引言 在编程语言的广阔世界中&#xff0c;Ruby 以其简洁、优雅和强大的特性脱颖而出。它是一种动态、面向对象的脚本语言&#xff0c;具有丰富的表达能力和灵活性&#xff0c;适用于各种应用场景&#xff0c;从 Web 开发到自动化脚本&#xff0c;从数据处理到游戏开发。本…