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

server/2024/10/25 6:40:41/

[蓝桥杯 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/server/134629.html

相关文章

数学建模与优化算法:从基础理论到实际应用

数学建模和优化算法&#xff0c;它们不仅帮助我们理解和描述复杂系统的行为&#xff0c;还能找到系统性能最优化的解决方案。本文将从基础的数学理论出发&#xff0c;逐步深入到各种优化算法&#xff0c;并探讨它们在实际问题中的应用。 思维导图文件可获取&#xff1a;https:…

Spring+SpringMVC+SpringJDBC搭建web项目实现商品查询

准备工作&#xff1a;创建商品数据库&#xff0c;以及商品表 #创建数据库 DROP DATABASE IF EXISTS goodsDB; CREATE DATABASE goodsDB; USE goodsDB; #创建商品表 goods #id number 商品编号&#xff0c;主键 #name Varchar2(50) 商品名称&#xff0c;非空 #Price Numbe…

SSRF+Redis进行内网渗透

SSRFRedis进行内网渗透 一 环境搭建 准备一台服务器&#xff0c;开启了lampp以及redis&#xff0c;redis只允许内网访问 把上面这个注释放开后&#xff0c;redis就只能内网访问 启动redis 使用kali进行端口扫描&#xff0c;扫不到6379端口 kali连接不上redis ssrf漏洞代码 &…

CentOS7 上安装GitLab的经历

一、安装必要的基础环境 1.安装依赖包 [rootgitlab-server ~]#yum install curl policycoreutils openssh-server openssh-clients postfix wget git patch -y [rootgitlab-server ~]# systemctl start postfix 2.配置yum源(由于网络问题&#xff0c;国内用户请使用清华大学…

【.Net】【C#】Program.cs通用代码模板

【.Net】【C#】Web Core Api 通用代码模板 常用NuGetProgram.csappsettings.jsonlog4net.configVS2022 swagger文档配置 常用NuGet Microsoft.Extensions.Logging.Log4Net.AspNetCore Flurl Flurl.Http Program.cs using System.Reflection; using Microsoft.AspNetCore.Mvc…

ref属性的作用对象类型

1.组件类型 如果作用对象是组件类型的话 那么该组件就是在当前组件中局部注册的组件 即子组件 通过this.$refs.refname就可以实现父组件访问子组件的需求 2.普通元素类型 当然除了满足父组件访问子组件以外 通过ref属性也可以作用于当前组件中的普通元素 并且通过this.$refs…

Python异步编程中的Producer-Consumer模式

Python异步编程中的Producer-Consumer模式 1. Producer-Consumer模式简介1.1 生产者&#xff08;Producer&#xff09;1.2 消费者&#xff08;Consumer&#xff09;1.3 队列&#xff08;Queue&#xff09; 2. 示例代码2.1 简单的Producer-Consumer示例2.2 多消费者示例2.3 带批…

【H2O2|全栈】JS入门知识(八)DOM(2)

目录 JS 前言 准备工作 排他操作 概念 案例 开关 概念 案例 自定义属性 设置属性 获取属性 移除属性 H5标准自定义属性格式规范 案例 节点 层级 父节点 子节点 兄弟节点 创建节点 添加节点 案例 结束语 JS 前言 本系列博客主要分享JavaScript的基础…