Leetcode 2819. 购买巧克力后的最小相对损失

article/2025/6/24 17:11:00

1.题目基本信息

1.1.题目描述

现给定一个整数数组 prices,表示巧克力的价格;以及一个二维整数数组 queries,其中 queries[i] = [ki, mi]。

Alice 和 Bob 去买巧克力,Alice 提出了一种付款方式,而 Bob 同意了。

对于每个 queries[i] ,它的条件如下:

  • 如果一块巧克力的价格 小于等于 ki,那么 Bob 为它付款。

  • 否则,Bob 为其中 ki 部分付款,而 Alice 为 剩余 部分付款。

Bob 想要选择 恰好 mi 块巧克力,使得他的 相对损失最小 。更具体地说,如果总共 Alice 付款了 ai,Bob 付款了 bi,那么 Bob 希望最小化 bi - ai。

返回一个整数数组 ans,其中 ans[i] 是 Bob 在 queries[i] 中可能的 最小相对损失 。

1.2.题目地址

https://leetcode.cn/problems/minimum-relative-loss-after-buying-chocolates/description/

2.解题方法

2.1.解题思路

滑动窗口+二分查找

2.2.解题步骤

第一步,记n=len(prices),将prices升序排列

第二步,枚举每一个queries[i]=[k,m]

  • 2.1.构建losses数组,如果prices[i]<=k,losses[i]=prices[i];如果prices[i]>k,losses[i]=k-(prices[i]-k)=2*k-prices[i];并求losses数组的前缀和数组lossPreSums,则可以在O(1)时间内查询到子数组的和

  • 2.2.证明:由prices递增可知,losses一定是先非严格递增后非严格递减,那么要让总损失最小,只能取larr1=losses[0,1,...,x]和larr2=losses[n-m+x+1,...,n-1],此时的损失f(x)=sum(larr1)+sum(larr2)=sum(prices[0,...,x])+sum([2k-prices[i] for i in [x+n-m+1,...,n-1]]),则f(x+1)-f(x)=prices[x]+prices[x+n-m+1]-2k,可知f(x)是先递减后递增的;那么对于中间长度为n-m的滑动窗口的和val=sum(losses[x+1,...,x+n-m])就是先递增后递减的,只要找到val的最大值,就找到了最小损失值

3.解题代码

python代码

from bisect import bisect_leftclass Solution:def minimumRelativeLosses(self, prices: List[int], queries: List[List[int]]) -> List[int]:# 思路1:滑动窗口+二分查找# 第一步,记n=len(prices),将prices升序排列;并前缀和数组,preSums[i]为前i项的前缀和n = len(prices)preSums = [0]prices.sort()for i in range(n):preSums.append(preSums[-1] + prices[i])# print("preSums", preSums)# 第二步,枚举每一个queries[i]=[k,m]result = []for k, m in queries:# 2.1.证明:由prices递增可知,losses一定是先非严格递增后非严格递减,那么要让总损失最小,只能取larr1=losses[0,1,...,x]和larr2=losses[n-m+x+1,...,n-1],此时的损失f(x)=sum(larr1)+sum(larr2)=sum(prices[0,...,x])+sum([2k-prices[i] for i in [x+n-m+1,...,n-1]]),则f(x+1)-f(x)=prices[x]+prices[x+n-m+1]-2k,可知f(x)是先递减后递增的;那么对于中间长度为n-m的滑动窗口的和val=sum(losses[x+1,...,x+n-m])就是先递增后递减的,只要找到val的最大值,就找到了最小损失值# 2.2.找到第一个price大于等于k的索引位置,记为p1p1 = bisect_left(prices, k)# print("p1", p1)# 2.3.从[0,...,p1]中找到第一个index,记index2=index+(n-m),使prices[index]>=2*k-prices[index2]。红蓝染色不变量:prices[left-1]<2*k-prices[index2]恒成立,最终的left即为要找的indexleft, right = 0, p1while left < right:mid = (right - left) // 2 + leftindex2 = mid + n - mif index2 < n and prices[mid] < 2 * k - prices[index2]:left = mid + 1else:right = midindex = left# print("left, right", left, right)# 2.4.根据index求最小损失,minLoss=sum(prices[0,...,index-1])+sum([2*k-prices[j] for j in [index+n-m,...,n-1]])val = preSums[index] + 2 * k * (m - index) - (preSums[n] - preSums[index + n - m])result.append(val)return result

4.执行结果


http://www.hkcw.cn/article/tMIhSejNDu.shtml

相关文章

Torch Geometric环境下无线通信网络拓扑推理节点数据缺失实验

节点数据缺失样本生成&#xff1a; gcn_dataset_incomplete.py #作者&#xff1a;zhouzhichao #创建时间&#xff1a;2025/5/30 #内容&#xff1a;生成残缺数据集用于实验import h5py import numpy as np import torch from torch_geometric.data import InMemoryDataset, Da…

【网络与信息安全】实验三 RSA加解密与签名验证

实验三、RSA加解密与签名验证 一、实验基本信息 实验名称&#xff1a;RSA加解密与签名验证实验目的&#xff1a; 理解 RSA 加密解密 与 数字签名验证 的原理。借助 CyberChef 可视化平台&#xff0c;观察和理解加密与签名背后的数据变化。 二、实验环境 操作系统&#xff1a…

HackMyVM-Ephemeral3

信息搜集 主机发现 ┌──(root㉿kali)-[~] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:39:60:4c, IPv4: 192.168.43.126 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.43.1 c6:45:66:05:91:88 …

131. 分割回文串-两种回溯思路

我们可以将字符串分割成若干回文子串&#xff0c;返回所有可能的方案。如果将问题分解&#xff0c;可以表示为分割长度为n-1的子字符串&#xff0c;这与原问题性质相同&#xff0c;因此可以采用递归方法解决。 为什么回溯与递归存在联系&#xff1f;在解决这个问题时&#xff0…

Another Redis Desktop Manager 1.3.7 安装教程 - 详细步骤图解 (Windows)

在安装前需要下载安装包&#xff1a;https://pan.quark.cn/s/2dd4432cefaa 下载安装包 先找到那个叫 Another-Redis-Desktop-Manager.1.3.7.exe 的文件&#xff0c;双击它运行 安装向导 接着会出来安装界面&#xff0c;直接点“下一步”&#xff08;Next&#xff09;继续。 …

ShenNiusModularity项目源码学习(32:ShenNius.Admin.Mvc项目分析-17)

栏目管理页面用于新建、维护及删除系统CMS管理模块的栏目信息&#xff0c;栏目信息用于分类管理文章&#xff0c;其后台控制器类ColumnController位于ShenNius.Admin.Mvc项目的Areas\Cms\Controllers内&#xff0c;页面文件位于同项目的Areas\Cms\Views\Column内&#xff0c;其…

Python(十四)

1.type函数和init_subclass_ init_subclass_ 2.元类 类就是用来创建对象的模版&#xff0c;类是由type创造而来的&#xff0c;元类就是创建类的模版&#xff0c;type可以用来创造类&#xff0c;因为type本身就是一个元类&#xff0c;使用元类来创造类&#xff0c;元类之间也有…

Unity3D仿星露谷物语开发58之保存时钟信息到文件

1、目标 保存当前的时钟信息到文件中。 2、修改TimeManager对象 TimeManager对象添加组件&#xff1a;Generate GUID 3、修改SceneSave.cs脚本 添加1行代码&#xff1a; 4、修改TimeManager.cs脚本 添加&#xff1a; using System; 修改TimeManager类&#xff1a; 添加属…

蓝桥杯java2022年十三届国赛大学A组答案整理

小蓝与钥匙 问题描述 小蓝是幼儿园的老师, 他的班上有 28 个孩子, 今天他和孩子们一起进行了 一个游戏。 小蓝所在的学校是寄宿制学校, 28 个孩子分别有一个自己的房间, 每个房 间对应一把钥匙, 每把钥匙只能打开自己的门。现在小蓝让这 28 个孩子分别将 自己宿舍的钥匙上交…

【Block总结】Dynamic Tanh (DyT)|即插即用|何凯明和Yann LeCun署名

论文信息 Dynamic Tanh (DyT) 是由Meta、NYU、MIT和Princeton的研究团队提出的一种新方法,旨在取代Transformer模型中的归一化层(如LayerNorm和RMSNorm)。论文的核心目标是挑战深度学习中“归一化层不可或缺”的传统认知,提出一种更简单、更高效的替代方案。 DyT 的提出基…

不加载PHP OpenTelemetry SDK实现Trace‌与Logs

目录 前言一、回到OpenTelemetry原理看问题1、数据接收&#xff08;Receivers&#xff09;2、数据处理&#xff08;Processors&#xff09;3、数据导出&#xff08;Exporters&#xff09; 二、不加载OpenTelemetry SDK实现Trace‌与Logs示例 前言 前面两篇我们分别介绍了OpenT…

一文认识并学会c++模板初阶

文章目录 泛型编程&#xff1a;概念 函数模板概念&#xff1a;&#x1f6a9;函数模板格式原理&#xff1a;&#x1f6a9;函数模板实例化与非模板函数共存 类模板类模板实例化 泛型编程&#xff1a; 概念 &#x1f6a9;编写与类型无关的通用代码&#xff0c;是代码复写一种手段…

leetcode刷题日记——二叉树的右视图

[ 题目描述 ]&#xff1a; [ 思路 ]&#xff1a; 二叉树的右视图&#xff1a;即二叉树每层最右边的节点BFS&#xff1a;使用层次遍历&#xff0c;每当遍历到每层最后一个节点时&#xff0c;记录改节点的值运行如下 int* rightSideView(struct TreeNode* root, int* returnS…

python 空气质量可视化,数据分析 + 前后端分离 + ppt 演讲大纲

1. 起因&#xff0c; 目的: 前段时间写的一个小项目&#xff0c;整理为一篇文章&#xff0c;发布出去&#xff0c;然后删掉项目。完整项目&#xff0c;见顶部链接。使用过程&#xff0c; 下面有说明。 2. 先看效果 3. 过程: 后端 python fastapi前端 python plotly # 数据…

|从零开始的Pyside2界面编程|绘图、布局及页面切换

&#x1f411; |从零开始的Pyside2界面编程| 布局及页面切换&#x1f411; 文章目录 &#x1f411; |从零开始的Pyside2界面编程| 布局及页面切换&#x1f411;♈前言♈♈页面切换♈♈页面布局♈♈总结♈ ♈前言♈ 经过两周的学习自己设备的前端也算是完成了一小半了&#xff…

我的世界Java版1.21.4的Fabric模组开发教程(十一)创建方块

这是适用于Minecraft Java版1.21.4的Fabric模组开发系列教程专栏第十一章——创建方块。想要阅读其他内容&#xff0c;请查看或订阅上面的专栏。 方块(Block) 是构成Minecraft世界的主要组成部分&#xff0c;是组成游戏地图的最基本单元&#xff0c;也是模组开发的核心元素之一…

计算机网络:物理层

目录 一、物理层的基本概念 二、物理层下面的传输媒体 2.1 导引型传输媒体 2.1.1 同轴电缆 2.1.2 双绞线 2.1.3 光纤 2.1.4 电力线 2.2 非导引型传输媒体 2.2.1 无线电波 2.2.2 微波 2.2.3 红外线 2.2.4 可见光 三、传输方式 3.1 串行与并行 3.2 同步与异步 3.…

我的世界Java版1.21.4的Fabric模组开发教程(十)更多物品交互行为

这是适用于Minecraft Java版1.21.4的Fabric模组开发系列教程专栏第十章——更多物品交互行为。想要阅读其他内容&#xff0c;请查看或订阅上面的专栏。 在之前的创建自定义数据组件章节中&#xff0c;我们在自定义物品类中重写了来自Item类中的use()方法&#xff0c;实现了在右…

Linux531rsync定时同步 再回忆

rsync定时同步 环境配置 关闭防火墙&#xff0c;selinux systemctl stop firewalld systemctl disable firewall setenforce 0 cat /etc/selinux/configpei SELINUXdisable设置主机名 systemctl set-hostname code systemctl set-hostname backup设置静态IP rsync由于要设…

MySQL数据库复合查询

前言&#xff1a;本文不对SQL查询做详细讲解&#xff0c;而做案例实践&#xff0c;适合已掌握MySQL基础语法&#xff0c;需要通过实际案例巩固技能的开发者。 首先准备这样三张表 雇员信息表、部门信息、薪水等级。如下&#xff1a; 需要库文件的小伙伴私信我哦&#xff01;&am…