牛客周赛 Round 31 E.小红的子集取反【dp+设置偏移量】

原题链接:https://ac.nowcoder.com/acm/contest/74362/E

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

小红拿到了一个数组,她准备选择若干元素乘以 -1,使得最终所有元素的和为 0。小红想知道最少需要选择多少个元素?

输入描述:

第一行输入一个正整数n,代表数组的大小。
第二行输入n个整数ai,代表数组的元素。
1≤n≤200
−200≤ai≤200

输出描述:

如果无法使得最终所有元素之和为 0,则输出 -1。
否则输出一个整数,代表选择元素的最小数量。

示例1

输入

3
1 -2 3

输出

1

说明

选择第一个元素即可。

示例2

输入

3
2 -2 3

输出

-1

解题思路:

这个题目要求我们选中数组中的一部分数使得乘以-1,然后最终数组和为0,要求的是最少要使得多少数乘以-1,才能使得最终数组的和为0,我之前遇到过一次和这个题目非常相似的题目,那个题目是Acwing5386. 进水出水问题,这俩个题目很相似,所以看到这个题目我很快就想到了解法,进水出水问题是将进水总量和出水总量的差值设置为状态,这里同样可以这样设置状态,我们将没有乘-1和乘了-1的部分的差值设为状态即可,由于这里的-200<=ai<=200,n=200,所以差值可能的范围为[-40000,40000],dp数组会出现负数下标,我们需要设置一个偏移量,我们可以设置偏移量为40000,那么差的范围变为[0,80000],然后dp处理即可。

dp处理过程:

状态定义:

操作指的是就某个位置乘以-1这个操作

定义f[i][j]表示处理完前i个物品并且操作部分和没有操作部分差为j的最少操作步数。

设B=40000为偏移值

初始化:

f[0][0]=0,由于要偏移B,所以f[0][B]=0

状态转移:

当前位置不操作,也就是不乘-1;

f[i][j]=f[i-1][j-a[i]]

当前位置操作,也就是乘以-1

f[i][j]=f[i-1][j+a[i]]+1

最终答案:

最终答案应该是操作部分和不操作部分差为0,所以答案是f[n][0],

由于还有偏移量,所以答案是f[n][B]

时间复杂度:dp状态个数为O(n*80000),转移为O(1),所以最终时间复杂度为O(80000*n)。

空间复杂度:dp数组为O(n*80000),所以空间复杂度为O(80000*n)。

cpp代码如下:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;const int N=210,M=80010,B=40000;int n;
int a[N];
int f[N][M];
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);memset(f,0x3f,sizeof f);f[0][B]=0;  //初始化for(int i=1;i<=n;i++)for(int j=0;j<=80000;j++){//当前不乘-1,操作次数不变if(j-a[i]>=0)f[i][j]=min(f[i][j],f[i-1][j-a[i]]);//当前位置乘-1,操作次数加1if(j+a[i]<=80000)f[i][j]=min(f[i][j],f[i-1][j+a[i]]+1);}/*乘-1的个数肯定不会超过数组大小,所以当这里的f[n][B]大于n时说明无法使得最终所有元素和为0*/if(f[n][B]<=n)printf("%d\n",f[n][B]);else printf("%d\n",-1);return 0;
}

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

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

相关文章

python将Word页面纸张方向设置为横向

通过python-docx的章节属性&#xff0c;就可以更改纸张方向、纸张尺寸。 import docx from docx.enum.section import WD_ORIENT from docx.shared import Cmdocument docx.Document() section document.sections[0]# 设置纸张大小为A4大小 section.page_width Cm(21) sect…

work day7

第七章 运算符重载 一、填空题 1、在下列程序的空格处填上适当的字句&#xff0c;使输出为&#xff1a;0&#xff0c;2&#xff0c;10。 #include <iostream> #include <math.h> class Magic {double x; public: Magic(double d0.00):x(fabs(d)) {} Magic operato…

2023年全国职业院校技能大赛软件测试赛题第3套

2023年全国职业院校技能大赛 软件测试赛题第3套 赛项名称&#xff1a; 软件测试 英文名称&#xff1a; Software Testing 赛项编号&#xff1a; GZ034 归属产业&#xff1a; 电子与信息大类 …

语雀·教育邮箱现在提供免费一年会员资格!

作为一位深度使用电子笔记的用户&#xff0c;我曾长期使用印象笔记&#xff0c;后来发现有道云笔记也非常适合我的需求。然而&#xff0c;我最近发现语雀和飞书等云笔记服务越来越出色。&#xff08;相比之下&#xff0c;有道云笔记的启动速度较慢&#xff0c;而且存在各种广告…

Rust 初体验1

Rust 初体验 安装 打开官网&#xff0c;下载 rustup-init.exe&#xff0c; 选择缺省模式&#xff08;1&#xff09;安装。 国内源设置 在 .Cargo 目录下新建 config 文件&#xff0c;添加如下内容&#xff1a; [source.crates-io] registry "https://github.com/rus…

【教程】微服务使用Feign接口进行远程调用的步骤

Sample 以 finance 模块 调用 exchange 模块 的 MarketService 为例。 Steps 服务提供者&#xff08;exchange&#xff09;&#xff1a;搭建接口 在 exchange-api 下&#xff0c;新建 MarketDto 和 MarketServiceFeign。并在 exchange-service 下使用 MapStruct 进行映射。…

JVM 性能调优- 五种内存溢出(5)

在介绍之前先简单介绍下 直接内存(Direct Memory)和堆内存(Heap Memory): 关系: 直接内存并不是Java虚拟机的一部分,它是通过Java的NIO库中的ByteBuffer来分配和管理的。直接内存通常由操作系统的本地内存(Native Memory)提供支持。堆内存是Java虚拟机的一部分,用于存…

在线音乐服务器测试报告

一、项目背景 在线音乐服务器采用前后端分离的方法来实现&#xff0c;同时使用了数据库来存储相关的数据&#xff0c;同时将其部署到云服务器上。前端主要有个页面构成&#xff1a;登录页、音乐列表页、收藏音乐页等&#xff0c;以上模拟实现了最简单的在线音乐服务器。其结合后…

【深入浅出MySQL】「底层原理」InnoDB索引原理全程实操指南,带你从入门到精通

InnoDB索引原理全程实操指南&#xff0c;带你从入门到精通 每日一句前言概述正文介绍索引的介绍创建索引聚集索引非聚集索引**如果我的表没有建立主键该怎么办呢&#xff1f;** 索引原理什么情况不去聚集索引树去查询&#xff1f;版权声明 每日一句 不要停顿,因为别人会超过你;…

机器学习 | 揭示EM算法和马尔可夫链的实际应用

目录 初识EM算法 马尔可夫链 HMM模型基础 HMM模型使用 初识EM算法 EM算法是一种求解含有隐变量的概率模型参数的迭代算法。该算法通过交替进行两个步骤&#xff1a;E步骤和M步骤&#xff0c;从而不断逼近模型的最优参数值。EM算法也称期望最大化算法&#xff0c;它是一个基…

机器学习——流形学习

流形学习是一种在机器学习领域中用于理解和分析数据的技术。它的核心思想是&#xff0c;尽管我们通常将数据表示为高维空间中的向量&#xff0c;但实际上数据可能具有较低维度的内在结构&#xff0c;这种结构被称为流形。流形学习的目标是发现并利用数据的这种潜在结构&#xf…

H12-821_28

28.如图所示,在一个纯IPv6环境中,若想实现PC1与PC2之间的通信,下列哪组地址可以分别配置在PC1与P2上 A.2001:FDC:1/64 2001:FDC::2/64 B.2001:FDC::1/64 2001:FDC1::2/64 C.FD00:1AC0:872E::1/64 FD00:2BE1:2320::1/64 D.FE80::1/64 FE80::2/64 答案&#xff1a;B 注释&…

图数据库 之 Neo4j - 背景介绍(1)

引言 Neo4j是一种高性能的图数据库&#xff0c;它专门设计用于存储、管理和查询大规模的图数据。与传统的关系型数据库不同&#xff0c;Neo4j以图的形式存储数据&#xff0c;其中节点表示实体&#xff0c;边表示实体之间的关系。这种图数据模型非常适合表示复杂的关系和连接。…

Termux配置安卓编译环境

前言 Termux安装后&#xff0c;就相当于把手机变成了一台Linux服务器&#xff0c;而且现在手机卡通常是能拿到ipv6公网地址的&#xff0c;所以&#xff0c;这个服务器能干啥&#xff1f; 编程搭建网站跑脚本 本文讲述的就是怎么在Termux搭建安卓编译环境&#xff0c;实现手机…

GraphicsMagick 的 OpenCL 开发记录(三十二)

文章目录 如何写ScaleImage()的硬件加速函数&#xff08;六&#xff09; <2022-04-27 周三> 如何写ScaleImage()的硬件加速函数&#xff08;六&#xff09; 不管什么事儿看来都怕琢磨&#xff0c;如果连做梦都能梦到你正在琢磨的事儿&#xff0c;估计离成功也就不远了。…

c++之说_12|模板

关于模板&#xff0c;至少我们要先了解几个概念 一&#xff1a;函数模板 二&#xff1a;类模板 三&#xff1a;模板特化 四&#xff1a;形参参数包 模板覆盖的东西太多 我目前也不了解太多 函数模板 语法 template<typename 类型名,typename 类型名,typename ...多参…

【JavaScript学习路线——详细讲解】

JavaScript学习路线 1. 介绍2. JavaScript基础3. HTML/CSS与JavaScript结合4. 进阶JavaScript5. 前端框架与库6. API与HTTP通信7. 移动端和PWA8. Node.js和后端开发9. 测试和部署10. 全栈项目实践11. 持续学习和社区参与 1. 介绍 学习JavaScript的路线可以分为几个主要阶段&am…

【水文】计算斐波那契数列的第n项

#include <stdio.h> // 函数声明 int fibonacci(int n); int main() { // 输入正整数n int n; printf("请输入一个正整数 n&#xff1a;"); scanf("%d", &n); // 调用函数计算斐波那契数列的第n项并输出结果 int result …

CopyOnWriteArrayList底层原理全面解析【建议收藏】

简介 CopyOnWriteArrayList是Java中的一个线程安全的集合类&#xff0c;是ArrayList线程安全版本&#xff0c;主要通过Copy-On-Write&#xff08;写时复制&#xff0c;简称COW&#xff09;机制来保证线程安全。 Copy-On-Write机制核心思想&#xff1a;向一个数组中添加数据时…

LabVIEW动平衡测试与振动分析系统

LabVIEW动平衡测试与振动分析系统 介绍了利用LabVIEW软件和虚拟仪器技术开发一个动平衡测试与振动分析系统。该系统旨在提高旋转机械设备的测试精度和可靠性&#xff0c;通过精确测量和分析设备的振动数据&#xff0c;以识别和校正不平衡问题&#xff0c;从而保证机械设备的高…