贪心,CF721 D. Maxim and Array

目录

一、题目

1、题目描述

2、输入输出

2.1输入

2.2输出

3、原题链接

二、解题报告

1、思路分析

2、复杂度

3、代码详解


一、题目

1、题目描述

2、输入输出

2.1输入

2.2输出

3、原题链接

Problem - 721D - Codeforces


二、解题报告

1、思路分析

如果我们当前乘积为正,那么我们首先要将乘积调整到非正(注意不一定是负)再继续求解,这一步很好想,找到绝对值最小的元素将其调整变号即可(注意变号有可能是变为0,为什么调整到0和后面的策略有关)

我们最终的结果有两种情况,正值/非正值

  1. 结果是正数的情况
    1. 初值为正,使绝对值最小数变号所需次数不够,那我们只能使得最后结果是正的。我们发现将绝对值最小的数变号即调整到0最优。否则,如果我们将a、b(a < b)两个元素分别操作ka、kb次,那么(a - ka * x)(b - kb * x) = ab - bka * x - akb * x + ka * kb * x^2 >= ab - b ka * x - bkb * x = b * (a - (ka + kb) * x),故得证。所以当无法调整变号时,我们调整绝对值最小的数是最优的
  2. 结果是负数的情况
    1. 调整完后,我们整体乘积应该是小于等于0的
    2. 我们先考虑小于0了已经,那么剩下元素该如何调整呢?——每次操作应当选择绝对值最小的进行操作,因为一次操作后的乘积和操作前的乘积比值为|a| + x / |a|,显然|a|越小越好
    3. 现在来考虑0,原数组中是有一部分0的,我们应该对0/1 个0进行-x操作,剩下的0进行+x操作,如果不懂可以看代码理解,这个不好叙述

2、复杂度

时间复杂度: O(nlogn)空间复杂度:O(n)

3、代码详解

import heapq
import sysn, k, x = map(int, input().split())
nums = list(map(int, input().split()))neg = sum(1 for a in nums if a < 0) & 1if not neg:mi = 0for i in range(n):if abs(nums[i]) < abs(nums[mi]):mi = idec = (abs(nums[mi]) - 1) // x + 1if k < dec:nums[mi] += k * x if nums[mi] < 0 else k * -xprint(' '.join(map(str, nums)))exit()if nums[mi] < 0:neg = Truek -= decnums[mi] += dec * x if nums[mi] < 0 else dec * -xpq = [abs(nums[i]) * n + i for i in range(n)]
heapq.heapify(pq)
for _ in range(k):i = heapq.heappop(pq) % nif nums[i] == 0 and not neg:nums[i] -= xneg = Trueelse:nums[i] += x if nums[i] >= 0 else -xheapq.heappush(pq, abs(nums[i]) * n + i)
print(' '.join(map(str, nums)))

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

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

相关文章

微信云小程序快速上手云数据库+云函数+云存储的操作

&#x1f680; 作者 &#xff1a;“二当家-小D” &#x1f680; 博主简介&#xff1a;⭐前荔枝FM架构师、阿里资深工程师||曾任职于阿里巴巴担任多个项目负责人&#xff0c;8年开发架构经验&#xff0c;精通java,擅长分布式高并发架构,自动化压力测试&#xff0c;微服务容器化k…

Options API:选项式 API改成Composition API:组合式 API的留言板

让我欢喜让我忧 改成Composition API:组合式 API的代码&#xff0c; <template><!-- start --><span class"span_checkbox">操作<input type"checkbox" v-model"showInput" value"操作" /></span><…

数据结构与算法学习笔记三---栈和队列的表示和实现(C语言)

目录 前言 一、栈 1.栈的概念 2.栈的表示和实现 1.定义 2.初始化 3.销毁 4.清空 5.栈空 6.栈的长度 7.获取栈顶元素 8.入栈 9.出栈 10.遍历 11.完整代码 二、队列 1.队列的概念 2.队列的链式表示和实现 1.定义 2.初始化 3.销毁 4.清空 5.空队列 6.队列长…

大型语言模型(LLMs)是怎样“学习”的?一封给网络工程师的大模型指南

数字时代&#xff0c;人工智能&#xff08;AI&#xff09;及其相关技术正日益成为许多领域的热门话题。其中&#xff0c;生成式人工智能&#xff08;Gen AI&#xff09;和大型语言模型&#xff08;LLMs&#xff09;引起了广泛的兴趣和讨论。然而&#xff0c;尽管这些术语在科技…

哪些博客类型是最受欢迎的?

在创建博客时&#xff0c;您可能会想到的最常见的问题之一是哪些是最受欢迎的博客类型&#xff1f;有许多不同类型的博客涉及广泛的主题&#xff0c;兴趣和受众。对于一个成功的博客&#xff0c;你需要提前计划并选择适合你的利基市场。在本文中&#xff0c;我们将分享您可以立…

在IDEA中如何用Kafka进行异步处理

在IDEA的项目中使用Kafka进行异步处理 在项目的pom.xml文件中&#xff0c;添加以下依赖&#xff1a; <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>2.5.0</version> </dep…

旋转矩阵(将坐标轴旋转)

旋转矩阵&#xff08;将坐标轴旋转&#xff09; 在二维空间中&#xff0c;旋转可以用一个单一的角 定义。作为约定&#xff0c;正角表示逆时针旋转。把笛卡尔坐标的列向量关于原点逆时针旋转的矩阵是&#xff1a; 原坐标系下 坐标系逆时针旋转β 补充 sin(-a) -sin(a) co…

C++中的匿名对象

在C中&#xff0c;匿名对象指的是没有显式命名的临时对象。这些对象通常在表达式中创建并使用&#xff0c;然后很快就被销毁。匿名对象是一种非常有用的编程工具&#xff0c;它们可以用于简化代码、进行函数调用或者作为其他对象的初始化值。 特点和用途 立即销毁&#xff1a…

Python 正则表达式 re.match() 和 re.search() 方法

Python re.match 和 re.search 方法 正文re.match() 方法示例一示例二 re.search()示例一示例二 正文 re.match() 方法 调用方法&#xff1a; re.match(pattern, string, flags0)用法说明&#xff1a; 该函数在字符串的起始位置处进行匹配&#xff0c;若匹配到则返回该值&am…

Google Pixel4手机刷机+Root+逆向环境详细教程

Google Pixel4手机刷机Root逆向环境配置详细教程 刷机工具下载 Windows10、Google Pixel4手机当前安卓10系统、adb工具、要刷的谷歌原生的Android11最新刷机包、安装google usb驱动、美版临时twrp-3.6.0_11-0-flame.img和美版永久twrp-installer-3.6.0_11-0-flame.zip、Magis…

程序员有什么实用神器?

程序员的实用神器 在软件开发的海洋中&#xff0c;程序员的实用神器如同航海中的指南针&#xff0c;帮助他们导航、加速开发、优化代码质量&#xff0c;并最终抵达成功的彼岸。这些工具覆盖了从代码编写、版本控制到测试和部署的各个环节。 程序员常用的一些神器包括&#xf…

C++ map set

一.关联式容器 在初期学过的vector、list、deque、forward_list(C11)等&#xff0c;底层都为线性序列的序列式容器。 关联式容器是用来存储数据的&#xff0c;于序列式容器不同的是&#xff0c;里面存储的是<key,value>结构的键值对&#xff0c;在数据检索时比序列式容…

qiankun实现微前端,vue3为主应用,分别引入vue2和vue3微应用

1、vue3主应用配置 1、安装 qiankun yarn add qiankun # 或者 npm i qiankun -S2、在主应用中注册微应用 import { registerMicroApps, start } from "qiankun" const apps [{ name: vue2App, // 应用名称 xs_yiqing_vue2entry: //localhost:8080, // vue 应用…

apk一键换包名工具

工作需要 手动撸了个一键换包名的工具 1 给AndroidManifest.xml修改包名(修改完成后会覆盖原来的文件) java -jar xmleditor-1.0.jar -pkg [AndroidMainifest.xml] 2 给apk修改包名(修改完成后会在当前目录下生成一个新的apk) java -jar xmleditor-1.0.jar -pkgapk [xxx.ap…

C语言(递归)

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

数据结构——实现通讯录(附源码)

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 点击主页&#xff1a;optimistic_chen和专栏&#xff1a;c语言&#xff0c; 创作不易&#xff0c;大佬们点赞鼓…

layui的treeTable组件,多层级上传按钮失效的问题解决

现象描述: layui的treeTable 的上传按钮在一层能用&#xff0c;展开后其他按钮正常点击&#xff0c;上传按钮无效。 具体原因没有深究&#xff0c;大概率是展开的子菜单没有被渲染treeTable的done管理到&#xff0c;导致没有重绘上传按钮。 解决方案: 不使用layu的上传组件方法…

C语言常见的动态内存错误及几个经典笔试题以及c/c++内存开辟空间等的介绍

文章目录 前言一、常见的动态内存错误1. 对NULL指针的解引用操作2. 对动态开辟空间的越界访问3. 对非动态开辟内存使用free()4. 使用free释放一块动态开辟内存的一部分5. 对同一块动态内存多次释放6. 动态开辟内存忘记释放&#xff08;内存泄漏&#xff09; 二、几个经典笔试题…

rust容器、迭代器

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;点击跳转 目录 一&#xff0c;std容器 1&#xff0c;Vec&#xff08;向量、栈&#xff09; 2&#xff0c;VecDeque&#xff08;队列、双端队…

邦注科技 模具保护器 CCD电子眼 专业工业视觉检测设备

模具保护器是一种用于保护模具的设备&#xff0c;可以在塑料压铸和冲床等加工过程中起到保护模具的作用。以下是关于模具保护器在保护塑料压铸和冲床模具方面的应用&#xff1a; 塑料压铸模具保护器&#xff1a; 防止碰撞&#xff1a;在塑料压铸过程中&#xff0c;模具可能会…