leetcode2809. 使数组和小于等于 x 的最少时间 排序+0-1背包

Leetcode 超难题目 Hard 这道题很有可能是LC主站(LCP除外)新的天花板,之所以难度分没有超过1719题,是因为双周赛样本量本身不多,而这题有一定的“猜结论”。某个LC积分2900+的大佬认为,即使数据范围只有1000,这也是一道相当难的题目。因为记录dp[j]为最优时,nums[j]的最小值(注意nums[j]很可能是被改过的),这样的DP本身就很难想到。而同时保证dp[j]最大nums[j]最小是否就更利于后面的转移,这点非常难证明。这个题的数据范围并不是1000,因此需要单调数据结构优化来保证复杂度合理。 阅读详情
  • https://leetcode.cn/problems/minimum-time-to-make-array-sum-at-most-x/

  • 给你两个长度相等下标从 0 开始的整数数组 nums1 和 nums2 。每一秒,对于所有下标 0 <= i < nums1.length ,nums1[i] 的值都增加 nums2[i] 。操作 完成后 ,你可以进行如下操作:

  • 选择任一满足 0 <= i < nums1.length 的下标 i ,并使 nums1[i] = 0 。
    同时给你一个整数 x 。

  • 请你返回使 nums1 中所有元素之和小于等于x 所需要的最少时间,如果无法实现,那么返回 -1 。

示例 1:

输入:nums1 = [1,2,3], nums2 = [1,2,3], x = 4
输出:3
解释:
第 1 秒,我们对 i = 0 进行操作,得到 nums1 = [0,2+2,3+3] = [0,4,6] 。
第 2 秒,我们对 i = 1 进行操作,得到 nums1 = [0+1,0,6+3] = [1,0,9] 。
第 3 秒,我们对 i = 2 进行操作,得到 nums1 = [1+1,0+2,0] = [2,2,0] 。
现在 nums1 的和为 4 。不存在更少次数的操作,所以我们返回 3 。
示例 2:

输入:nums1 = [1,2,3], nums2 = [3,3,3], x = 4
输出:-1
解释:不管如何操作,nums1 的和总是会超过 x 。
 

提示:

1 <= nums1.length <= 103
1 <= nums1[i] <= 103
0 <= nums2[i] <= 103
nums1.length == nums2.length
0 <= x <= 106

题解

  • 答案最大为n,因为当操作n+1次时,代表有一个位置操作了两次,则那个位置的第一次操作被浪费掉了。

  • 所以可以遍历1到n,即选i个元素,计算操作之后的最小值

  • 先选择增量值小的(即nums2中值较小的,第一个选择的位置对应的val,会后续增加(i-1)*val,所以先选择nums2中值较小的)

  • dp[i][j] 表示在前 i -1个元素中,清除(收集)j个获得的最大收益

初始化 f[0][0]=0。
考虑第i 个数「选或不选」:
不选:
f[i+1][j]=f[i][j]。
选:
f[i+1][j]=f[i][j−1]+nums1[i]+nums2[i]⋅j。
这两种情况取最大值,即
f[i+1][j]=max(f[i][j],f[i][j−1]+nums1[i]+nums2[i]⋅j)

code

class Solution {
public:
    int minimumTime(vector<int>& nums1, vector<int>& nums2, int x) {
        int n = nums1.size();
        typedef pair<int, int> my_pair;
        // 所有元素按 nums2[i] 从小到大排序,保证无后效性
        vector<my_pair> vec;
        for (int i = 0; i < n; i++) 
        	vec.push_back(my_pair(nums2[i], nums1[i]));
        sort(vec.begin(), vec.end());

        // 套用 0-1背包 dp 方程
        const long long INF = 1e18;
        long long dp[n + 1][n + 1];
        for (int i = 0; i <= n; i++) 
            for (int j = 0; j <= n; j++) 
                dp[i][j] = -INF;
        dp[0][0] = 0;
        for (int i = 1; i <= n; i++) 
            for (int j = 0; j <= i; j++) {
                f[i][j] = f[i - 1][j];
                if (j > 0) 
                    dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + vec[i - 1].second +  j * vec[i - 1].first);
            }

        // 枚举所有操作可能的次数
        long long sm1 = 0, sm2 = 0;
        for (int x : nums1) sm1 += x;
        for (int x : nums2) sm2 += x;
        for (int i = 0; i <= n; i++) {
            long long t = sm1 + sm2 * i - dp[n][i];
            if (t <= x) return i;
        }
        return -1;
    }
};
  • 维度压缩
class Solution {
public:
    int minimumTime(vector<int>& nums1, vector<int>& nums2, int x) {
        int n = nums1.size();
        typedef pair<int, int> my_pair;
        // 所有元素按 nums2[i] 从小到大排序,保证无后效性
        vector<my_pair> vec;
        for (int i = 0; i < n; i++) vec.push_back(my_pair(nums2[i], nums1[i]));
        sort(vec.begin(), vec.end());

        // 套用 dp 方程
        const long long INF = 1e18;
        long long dp[n + 1];
        for (int i = 0; i <= n; i++) 
                dp[i] = -INF;
        dp[0] = 0;
        for (int i = 1; i <= n; i++) 
            for (int j = n; j > 0; j--) {
                    dp[j] = max(dp[j], dp[j - 1] + vec[i - 1].second +  j * vec[i - 1].first);
            }

        // 枚举所有操作可能的次数
        long long sm1 = 0, sm2 = 0;
        for (int x : nums1) sm1 += x;
        for (int x : nums2) sm2 += x;
        for (int i = 0; i <= n; i++) {
            long long t = sm1 + sm2 * i - dp[i];
            if (t <= x) return i;
        }
        return -1;
    }
};
手把手教你设计2bit反射型超表面:从单patch扫参到pin管配置全流程 本文提供了一份2bit反射型超表面设计的完整工程实践指南。从单贴片谐振器的参数化扫描与“270度法则”应用,到PIN二极管等效电路模型的获取与集成,再到利用参数化扫描高效仿真四种工作状态,手把手指导读者完成从单元设计到阵列布局、偏置线集成及加工考量的全流程,旨在帮助射频工程师将概念转化为可加工测试的实体模型。 阅读详情

相关推荐

SAE J1939协议详解

SAE J1939协议是由美国汽车工程师协会(SAE)制定的主要针对商用车的CAN总线通讯协议,其基础是CAN2.0B协议,面向对象为客车和载重货车;船舶、农业机械等非路面设备。1.SAE J1939协议文档结构如下图:2.CAN的发展概况20世纪80年代,Bosch的工程人员开始研究用于汽车的串行总线系统,1986年, Bosch在SAE(汽车工程师协会)大会上提出了 CAN,1987年,INTEL就推出了第一片CAN控制芯片—82526;随后Philips半导体推出了82C200。

weixin_46184756的博客 8446

Leetcode---110双周赛

leetcode---110双周赛

V_zjs的博客 271

开源实战 | 基于SolidWorks与Matlab的并联索驱机器人轨迹规划全流程

本文详细介绍了基于SolidWorks与Matlab的并联索驱机器人轨迹规划全流程,涵盖从基础概念到实战技巧的各个环节。通过SolidWorks建模、Matlab运动学实现及轨迹优化策略,展示了如何实现高精度轨迹规划,适用于摄影、医疗等领域的机器人应用。

weixin_28331555的博客 404

Leetcode 第 110 场双周赛 Problem D 2809. 使数组和小于等于 x 的最少时间(DP+贪心+正难则反)

Leetcode 第 110 场双周赛 Problem D 2809. 使数组和小于等于 x 的最少时间(DP 好题) 题目 给你两个长度相等下标从 0 开始的整数数组 nums1 和 nums2 。每一秒,对于所有下标 0

专注如一的博客 300

树莓派4B安装 ubuntu20.04 & VNC远程桌面 & 安装ROS noetic

树莓派4B安装ubuntu20.04 & VNC远程桌面1、安装ubuntu方式1:下载Imager文件。方式2:下载镜像文件。2、查询树莓派 IP 地址3、使用ssh远程登录树莓派4、更新源地址5、更新6、安装桌面环境7、允许root登陆8、登陆远程桌面9、设置中文 1、安装ubuntu 方式1:下载Imager文件。...

weixin_44415639的博客 2万+

深入解析Android Qcom Camera HAL3架构与Camx线程模块

本文深入解析了Android Qcom Camera HAL3架构与Camx线程模块的核心原理。文章以高通芯片平台为例,剖析了从按下快门到生成照片的完整Camera流程分析,重点阐述了Camx框架中线程池、消息队列及Fence同步机制如何协同工作,以实现高效、稳定的多线程并发图像处理,为相机性能优化提供理论基础。

weixin_29184075的博客 221

题解/算法 {6987. 使数组和小于等于 x 的最少时间}

1

qq_66485519的博客 176

MacOS Intel芯片实战:Docker Compose一键部署Dify全流程解析

本文详细解析了在搭载Intel芯片的MacOS系统上,使用Docker Compose一键部署开源LLM应用开发平台Dify的全流程。内容涵盖环境准备、Docker配置与镜像加速、代码拉取与配置初始化、服务启动与问题排查,以及访问验证与初步探索,旨在帮助开发者快速在本地搭建私有化AI应用开发环境。

ik678901234的博客 620

【Leetcode】2809. 使数组和小于等于 x 的最少时间

每日一题

想要AC的sjh的博客空间 1213

YOLOv11改进策略【损失函数篇】| WIoU v3:针对低质量样本的边界框回归损失函数

是一种基于IoU的损失函数,旨在解决目标检测中边界框回归损失函数在处理低质量训练数据时的问题。论文链接:https://arxiv.org/pdf/2301.10051 源码链接:https://github.com/Instinct323/wiou此处需要查看的文件是中定义了模型的损失函数和计算方法,我们想要加入新的损失函数就只需要将代码放到这个文件内即可将下方的函数替换原本的函数即可: 用于计算各种损失。在内修改如下代码,使模型调用此损失函数。 tal.py中是一些损失函数的功能应用。在内修改如下代码,

Limiiiing的博客 3797

★教程3:Simulink学习教程入门60例目录

1.订阅本教程用户可以免费获得本博任意1个(包括所有免费专栏和付费专栏)博文对应代码;2.本Simulink课程的所有案例(部分理论知识点除外)均由博主编写而成,供有兴趣的朋友们自己订阅学习使用。未经本人允许,禁止任何形式的商业用途;3.本课程除了介绍常见的Simulink模块介绍之外,我们更侧重于各种实例的完整设计介绍。从通信,控制器,图像处理,语音处理,电力系统等诸多常用领域介绍了相关案例,如果对于某个较为复杂的案例,初学者无法正确复现,也可以私信博主获得完整Simulink模型文件。

FPGA/MATLAB学习教程/源码/项目合作开发 1万+

力扣刷题第五天 使数组和小于等于x的最小时间

对于第 j 个元素,我们可以选择对其进行操作或者不操作,由此可以得到状态转移方程:dp[j][i]=max⁡(dp[j−1][i],dp[j−1][i−1]+nums2[j−1]×i+nums1[j−1])最终结果应为nums1的和加上nums2的和再减去可以消掉的最大数目。第 2 秒,我们对 i = 1 进行操作,得到 nums1 = [0+1,0,6+3] = [1,0,9]。第 3 秒,我们对 i = 2 进行操作,得到 nums1 = [1+1,0+2,0] = [2,2,0]。

a675891的博客 563

密码学系列3-Elgamal加密及其IND-CPA安全性证明

但这没有任何影响,敌手本身就只能知道公钥,他并没有能力知道挑战者是否知道对应的私钥。所以上述整个游戏就是一个模拟实验,敌手无法区分挑战者运行的是这个模拟实验,还是真正的按照第一节的算法构造的实验(挑战者知道私钥…为什么合起来的时候有1/2:因为T既可能是随机的也可能是g^{ab},这两种情况概率为1/2。能够攻破Elgamal加密方案,那么挑战者利用敌手的能力构建下面游戏,来求解困难性问题DDH。就是挑战者选的随机数,虽然挑战者自己也不知道。),否则挑战者输出0,作为DDH的回答。

qq_41359358的博客 1250

Qwen Max LeetCode 2809. 使数组和小于等于 x 的最少时间 Go实现

为了让 `j * nums2[i]` 最大,应让 `nums2[i]` 大的元素对应大的 `j` → 所以排序时小的在前,大的在后(升序)。👉 原因:在 DP 中,第 `j` 个被操作的元素贡献为 `nums1[i] + j * nums2[i]`。还想看其他题的 Go 实现吗?| **背包顺序** | 内层循环必须 `j--`(从后往前),否则会重复选同一个元素。| **排序写法** | 用 `sort.Slice` + 匿名函数,简洁又安全。| **边界处理** | `t=0` 要提前判断,避免漏解。

m0_37843156的博客 212

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Qwen模型 LeetCode 2809. 使数组和小于等于 x 的最少时间 Java实现

**按 `nums2[i] 升序排序** → 这样在 DP 中,`nums2` 大的元素会被分配更大的操作序号 `j`,从而 `j * nums2[i]` 更大,减得更多。| **整数溢出** | `sum1 + t * sum2` 可能超 `int`,必须用 `long`!| **背包顺序错误** | 内层循环必须 **从后往前**(`j--`),否则会重复选同一个元素(变成完全背包)。| **边界处理** | `t=0` 要单独判断,避免漏掉初始就满足的情况。// 当前元素作为第 j 个被操作的。

m0_37843156的博客 148

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

力扣OJ(2601-3000)

。。。

nameofcsdn的博客 1501

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

对角占优阵的行列式大于零的证明

M=(abcd)满足:a>∣b∣,d>∣c∣M=\left( \begin{array} { l l } { a } & { b } \\ { c } & { d} \end{array}\right)\\ 满足:a>|b|,d>|c| M=(ac​bd​)满足:a>∣b∣,d>∣c∣ 另M(t)=(ab∗tc∗td)t∈[0,1]f(t):t→det(M(t))f为连续函数,连续映射,f(t)⊂R,故联通(有介质性质),又因为f(t)≠0,f(0)=(a

ResumeProject的博客 5802

jar包下载网站

方法的第一个参数常常被命名为 self。 这也不过就是一个约定: self 这一名称在 Python 中绝对没有特殊含义。 但是要注意,不遵循此约定会使得你的代码对其他 Python 程序员来说缺乏可读性, 而且也可以想像一个 类浏览器 程序的编写可能会依赖于这样的约定。 方法可以通过使用 self 参数的方法属性调用其他方法: class Bag: def init(self): self.data = [] def add(self, x): self.data.append(x) def..

ResumeProject的博客 4349

RUST笔记:candle使用基础

Result定义在candle-core/src/error.rs 定义了一个 `Result` 类型,这是一个 `Result` 类型的别名。其中 `T` 是成功时的返回类型,而 `Error` 是失败时的错误类型。

ResumeProject的博客 3238

映射同伦等价(一般的+空间偶的)

在数学中,同伦(Homotopy)的概念在拓扑上描述了两个对象间的“连续变化”。 两个拓扑空间如果可以通过一系列连续的形变从一个变到另一个,那么就称这两个拓扑空间同伦。 f,g:X→Y给定的两个拓扑空间X和Y。考虑两个连续函数,若存在一个连续映射H:X×【0,1】→Y使得f,g:X\rightarrow Y给定的两个拓扑空间X和Y。考虑两个连续函数,若存在一个连续映射H:X×【0,1】 \rightarrow Y使得f,g:X→Y给定的两个拓扑空间X和Y。考虑两个连续函数,若存在一个连续映射H:X×【0,.

ResumeProject的博客 3209

Dirichlet Process (徐亦达老师)狄利克雷过程

混合高斯模型(Mixture of Gaussians,简称GMM)是一种概率模型,用于对复杂的数据分布进行建模。它是由多个高斯分布组合而成的混合模型,每个高斯分布(称为组件)对应数据的一个子群体。混合高斯模型的概率密度函数可以表示为多个高斯分布的线性组合,即每个分布乘以一个相应的权重。Pxi1∑K​πi​⋅Nx∣μi​Σi​其中,K是高斯分布的数量,πi​是对应于第 i 个高斯分布的权重,Nx∣μi​Σi​。

ResumeProject的博客 2889

RUST笔记: 动态链接库的创建和使用

【代码】RUST笔记: 动态链接库的创建和使用。

ResumeProject的博客 2804

拓扑学笔记:定义域的性质之紧性暂记(紧集“有界闭集”的性质)

https://www.zhihu.com/question/58904993 我举个关于紧集的形象解释吧:比如在天安门广场上有无穷多个人正在看升旗仪式这时候天空突然下起了大雨,可是人群当中只有有限个人带了雨伞,当他们把手中的雨伞撑开的时候惊奇的发现仅仅有限的几把伞竟然可以为全广场所有的人遮住雨,哈哈原来不必带无穷把伞啊! 对区间进行分割分析后推广到全空间的能力对区间进行分割分析后推广到全空间的能力对区间进行分割分析后推广到全空间的能力 再Rn中等价,也就是说在Rn中用处不大再R^n中等价,也就是说在R^

ResumeProject的博客 2073

基本群性质:同胚不变量,同伦不变量

基本群是(X,x0)到π1(X,x0)的映射设拓扑空间之间有映射f:(X,x0)→(Y,y0)设σ为X中的道路,则f∗σ为Y中的起点终点为y0的闭路基本群是(X,x_0)到\pi_1(X,x_0)的映射\\ 设拓扑空间之间有映射f:(X,x_0)\rightarrow (Y,y_0)\\ 设\sigma 为X中的道路,则f*\sigma 为 Y中的起点终点为y_0的闭路基本群是(X,x0​)到π1​(X,x0​)的映射设拓扑空间之间有映射f:(X,x0​)→(Y,y0​)设σ为X中的道路,则f∗σ为Y中的起

ResumeProject的博客 2055

拓扑学中的欧拉定理笔记(暂记)

欧拉定理:对于凸的多面体,v-e+f=2 凸:连线在内部,多面体:多个平面围城的空间 注:定理较弱,逆定理不成立,反例六面体挖个槽

ResumeProject的博客 1979

拓扑学笔记:拓扑学介绍,闭形式与恰当形式与“定义域”的关系

闭形式 w为 上的 1−形式w为\ 上的\ 1-形式w为 上的 1−形式 恰当形式

ResumeProject的博客 1750
上一篇: pytorch Stream 多流处理
下一篇: leetcode2808. 使循环数组所有元素相等的最少秒数 处理循环数组
FakeOccupational
博客等级 码龄6年 2万+粉丝 1727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值