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

news/2025/3/14 22:52:32/
  • 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;}
};

http://www.ppmy.cn/news/1016162.html

相关文章

Vue [Day5]

自定义指令 全局注册 和 局部注册 inserted在指令所在的元素 被插入到页面中时&#xff0c;触发 main.js import Vue from vue import App from ./App.vueVue.config.productionTip false// 1.全局注册指令 Vue.directive(focus, {// inserted在指令所在的元素 被插入到页…

react进阶

react-virtualized的高阶组件&#xff0c;Autosize可以使屏幕适配。使用render-props模式来获取到AutoSizer组件暴露的width和height属性。JSON.parse(JSON.stringify())不适用于有undefined的数据。 深拷贝的使用&#xff0c;不能使用在有undefined的数据中。有直接过滤undefi…

【Vue3】插槽全家桶

插槽&#xff08;Slots&#xff09;是 Vue.js 框架中的一个功能&#xff0c;允许在组件内部预留一些可替换的内容。通过插槽&#xff0c;可以给父组件填充模板代码&#xff0c;让父组件向子组件传递自定义的内容&#xff0c;以便在子组件中进行展示或处理。 1. 匿名插槽 Son.…

深入探索 Spring MVC:构建优雅的Web应用

文章目录 前言一、什么是 Spring MVC1.1 什么是 MVC1.2 什么是 Spring MVC 二、Spring MVC 项目的创建2.1 项目的创建2.2 第一个 Spring MVC 程序 —— Hello World 三、RequestMapping 注解3.1 常用属性3.2 方法级别和类级别注解3.3 GetMapping、PostMapping、PutMapping、Del…

【算法|数组】手撕经典二分法

算法|数组——二分查找 文章目录 算法|数组——二分查找引言二分查找左闭右闭写法左闭右开写法 总结 引言 首先学习这个算法之前需要了解数组知识&#xff1a;数组。 大概介绍以下&#xff1a; 数组是存储在连续内存空间上的相同类型数据的集合。数组下标都是从0开始。数组在…

深入探索C++模板:从基础到高级应用

目录 一、 泛型编程 1.1 为什么需要泛型编程&#xff1f; 二、模板 2.1 概念 2.2 函数模板 2.2.1 概念 2.2.2 语法 2.2.3 示例 2.2.4 模板实例化 隐式实例化 显示实例化 2.2.5 模板参数的匹配原则 2.3 类模板 2.3.1 概念 2.3.2 语法 2.3.3 示例 2.3.4 注意事项…

Unity游戏源码分享-塔防游戏保卫兔子的食物CarrotFantasy

Unity游戏源码分享-塔防游戏保卫兔子的食物CarrotFantasy 经典塔防游戏&#xff0c;可发布PC、Andoid、IOS、Web等 下载地址&#xff1a;https://download.csdn.net/download/Highning0007/88189987

商城-学习整理-基础-商品服务API-属性分组(七)

目录 一、创建系统菜单二、开发属性分组1、将三级分类功能抽取出来2、编写后端代码3、属性分组新增功能4、属性分组修改回显功能 三、品牌管理1、分页显示有点问题&#xff0c;使用MyBatis-Plus有点问题&#xff0c;需要使用分页插件&#xff0c;给容器中放一个2、修改模糊查询…