当前位置: 首页 > news >正文

个人练习-Leetcode-826. Most Profit Assigning Work

题目链接:https://leetcode.cn/problems/most-profit-assigning-work/

题目大意:给出一串任务,difficulty表示任务难度,profit表示任务的收益(以下简称diffpro)。给出一串工人的能力worker。每个工人只能做一个任务,且工人只能完成难度小于等于它能力的任务。同一人物可以完成多次。

思路:题目的关键是给每个工人找到【难度小于等于其能力的】【收益最大的】任务。

一开始的思路:暴力搜索,果不其然,寄了。。。

然后想到了前两天用过的线段树。先用一个map<int, int> pf记录某个diff能得到的最大的pro。这是为了当出现【多个任务难度相同收益却不同】的情况时,只记录收益最大的那个任务。因此,map的存储量应该是最小的。

线段树tree[]存的是【当前节点的区间内最大收益】。在初始化时,用updateTree()方法一一插入叶子节点,并且给每个非叶子节点记录左右儿子最大的收益。

随后,给每个工人,查询区间[1, worker[i]]内最大的收益。

几个例子在IDE里都通过了,但是leetcode里就是有heap-use-after-free的错误,查了查意思是引用了已经free掉的空间。然而我并没有debug出是哪里用了非法的空间。因此暂且先放这里。

线段树方法完整代码:

class Solution {
public:vector<int> tree;void updateTree(int root, int l, int r, int i, int val) {if (l == r) {tree[root] = val;return;}int mid = (l+r) / 2;if (i <= mid) {updateTree(root*2, l, mid, i, val);}else {updateTree(root*2+1, mid+1, r, i, val);}tree[root] = max(tree[root*2], tree[root*2+1]);}int getMax(int root, int l, int r, int L, int R) {if (L <= l && r <= R)return tree[root];int ret = 0;int mid = (l+r)/2;if (L <= mid)ret = getMax(root*2, l, mid, L, R);if (R > mid)ret = max(ret, getMax(root*2+1, mid+1, r, L, R));return ret;}int maxProfitAssignment(vector<int>& difficulty, vector<int>& profit, vector<int>& worker) {int ret = 0;map<int, int> pf;for (int i = 0; i < difficulty.size(); i++) {if (pf.find(difficulty[i]) == pf.end()) {pf[difficulty[i]] = profit[i];}else {pf[difficulty[i]] = max(pf[difficulty[i]], profit[i]);}}tree.resize(400004, 0);int N = tree.size()-1;for (auto it = pf.begin(); it != pf.end(); it++) {updateTree(1, 1, N, it->first, it->second);}for (int i = 0; i < worker.size(); i++) {ret += getMax(1, 1, N, 1, worker[i]);}return ret;}
};

随后查看了题解,明确了重点是【找到小于等于某个难度值能得到的最大收益】(其实与之相应的,之前线段树的方法里的查询区间,左区间固定为1,也就是需要的信息只有右区间)

首先,工人是无法完成难度大于他能力的任务的,所以先将任务按难度排序。随后,设arr[i]表示【能力为i的工人完成任务能得到的最大收益】。于是在两个任务难度之间的arr[i]都是相同的。但是要保证arr[]的元素都是递增的,也就是花费了更多的能力,不能使得到的收益变少。也就是考虑到【A任务难度大于B任务但收益小于B任务】的情况。因此添加一个对比,保证递增。

    int arr[100001] = {};int pos = jbs[0].first;int last_pro = 0;for (int i = 1; i < jbs.size(); i++) {int now_diff = jbs[i].first;int tmp_pro = max(last_pro, jbs[i-1].second);while (pos < now_diff) {arr[pos++] = tmp_pro;}last_pro = tmp_pro;}

而能力比最难的任务大的工人,能得到的收益也是最大的。

    last_pro = max(last_pro, jbs.back().second);while (pos <= *max_element(worker.begin(), worker.end())) {arr[pos++] = last_pro;}

最后将能得到的收益相加即可。

完整代码

bool cmp(pair<int, int> x, pair<int, int> y) {return x.first < y.first;
}class Solution {
public:int maxProfitAssignment(vector<int>& difficulty, vector<int>& profit, vector<int>& worker) {vector<pair<int, int>> jbs;for (int i = 0; i < difficulty.size(); i++)jbs.push_back(make_pair(difficulty[i], profit[i]));sort(jbs.begin(), jbs.end(), cmp);int arr[100001] = {};int pos = jbs[0].first;int last_pro = 0;for (int i = 1; i < jbs.size(); i++) {int now_diff = jbs[i].first;int tmp_pro = max(last_pro, jbs[i-1].second);while (pos < now_diff) {arr[pos++] = tmp_pro;}last_pro = tmp_pro;}last_pro = max(last_pro, jbs.back().second);while (pos <= *max_element(worker.begin(), worker.end())) {arr[pos++] = last_pro;}int ret = 0;for (int i = 0; i < worker.size(); i++) {ret += arr[worker[i]];}return ret;}
};

相关文章:

个人练习-Leetcode-826. Most Profit Assigning Work

题目链接&#xff1a;https://leetcode.cn/problems/most-profit-assigning-work/ 题目大意&#xff1a;给出一串任务&#xff0c;difficulty表示任务难度&#xff0c;profit表示任务的收益&#xff08;以下简称diff和pro&#xff09;。给出一串工人的能力worker。每个工人只能…...

云原生周刊:边缘计算会吞噬云吗?| 2023.3.13

文章推荐 边缘计算吞噬云&#xff1f; 这篇文章讨论了边缘计算对传统云计算的潜在冲击。 边缘计算是一种新型的计算架构&#xff0c;它将计算移动到离数据源和终端设备更近的地方&#xff0c;从而提供更快的响应时间和更好的用户体验。相比之下&#xff0c;云计算是一种集中…...

python+django+vue图书个性化推荐系统

整个系统是由多个功能模块组合而成的&#xff0c;要将所有的功能模块都一一列举出来&#xff0c;然后进行逐个的功能设计&#xff0c;使得每一个模块都有相对应的功能设计&#xff0c;然后进行系统整体的设计。 本图书个性化推荐系统结构图如图python manage.py runserver 开…...

经典文献阅读之--LIO-PPF(增量平面预拟合LIO)

0. 简介 自从ikd-tree出来后&#xff0c;现在越来越多的工作瞄准了增量式这种方法&#xff0c;比如说激光惯导里程计&#xff08;LIDAR-Inertial Odometry&#xff0c;LIO&#xff09;的高精度跟踪通常涉及最小化点到平面距离的k最近邻&#xff08;kNN&#xff09;搜索&#x…...

ChatGPT背后有哪些关键技术?CSIG企业行带你一探究竟

目录1 ChatGPT的时代2 CSIG企业行3 议题&嘉宾介绍3.1 对生成式人工智能的思考3.2 对话式大型语言模型研究3.3 文档图像处理中的底层视觉技术4 观看入口1 ChatGPT的时代 2015年&#xff0c;马斯克、美国创业孵化器Y Combinator总裁阿尔特曼、全球在线支付平台PayPal联合创始…...

C#基础之面向对象编程(二)

总目录 文章目录总目录前言一、概述1. 定义2. 面向对象的三大特性二、封装1. 定义2. 属性三、继承1. 定义2. 继承的使用3. base 和this四、多态1. 定义2. 重写和重载3. 多态性的实现1、静态多态性2、动态多态性4. 向上转型和向下转型1、定义2、语法格式3、案例结语前言 本文主…...

蓝桥杯刷题冲刺 | 倒计时25天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录1.完全二叉树1.完全二叉树 题目 链接&#xff1a; 完全二叉树的权值 - 蓝桥云课 (lanqiao.cn) 给…...

c语言—动态内存管理

一.为什么存在动态内存开辟开辟空间的特点&#xff1a;空间开辟大小是固定的数组在申明时&#xff0c;必须指定数组长度&#xff0c;她所需要的内存在编译时分配但是对于空间的需求&#xff0c;不仅仅是上述的情况。有时候我们需要的空间大小在程序运行的时候才能知道&#xff…...

请说明Ajax、Fetch、Axios三者的区别

相同点&#xff1a; 1、三者都用于网络请求&#xff0c;但是不同维度 2、 Ajax(Asynchronous Javascript and XML)&#xff0c;一种技术的统称&#xff0c;并不是实际的API 3、Fetch是一个具体的API&#xff0c;浏览器里面直接有一个API就叫Fetch 4、 Axios是一个第三方库&…...

阿里p8测试总监,让我们用这份《测试用例规范》,再也没加班过

经常看到无论是刚入职场的新人&#xff0c;还是工作了一段时间的老人&#xff0c;都会对编写测试用例感到困扰&#xff1f;例如&#xff1a; 固然&#xff0c;编写一份好的测试用例需要&#xff1a;充分的需求分析能力 理论及经验加持&#xff0c;作为测试职场摸爬打滚的老人&…...

【Unity】数据持久化路径Application.persistentDataPath

今天突然想到这个路径Application.persistentDataPath&#xff0c;热更的重要路径&#xff0c;该文件夹可读可写&#xff0c;在移动端唯一一个可读写操作的文件夹。移动端可以将本地的资源&#xff08;资源MD5值配置表&#xff09;等一些文件放到StreamingAssets文件夹下&#…...

华为OD机试 - 插队(Java JS Python)

题目描述 某银行将客户分为了若干个优先级, 1 级最高, 5 级最低,当你需要在银行办理业务时,优先级高的人随时可以插队到优先级低的人的前面。 现在给出一个人员到来和银行办理业务的时间序列,请你在每次银行办理业务时输出客户的编号。 如果同时有多位优先级相同且最高…...

MongoDB数据库从入门到精通系列之八:调整oplog大小

MongoDB数据库从入门到精通系列之八:调整oplog大小 一、oplog的概念二、oplog大小三、调整oplog大小详细步骤一、oplog的概念 操作日志oplog包含了主节点执行的每一次写操作。oplog是存在于主节点local数据库中的一个固定集合。从节点通过查询此集合以获取需要复制的操作。每个…...

PCL 间接平差法拟合二维直线

目录 一、算法原理二、代码实现三、结果展示四、相关链接一、算法原理 通过传统最小二乘法对点云数据进行二维直线拟合时,可将误差只归因于一个方向上,本文假设误差只存在于 y y y轴方向上,设点云拟合的二维直线方程为: y =...

进程调度的基本过程

这里写目录标题什么是进程进程管理结构体或类的主要属性pid内存指针文件描述符表辅助进程调度的属性并发并行并发什么是进程 进程是操作系统对一个正在运行的程序的一种抽象&#xff0c;也就是说&#xff0c;一个运行起来的程序就是一个进程。 进程又是操作系统进行资源分配的…...

python自动化办公(二)

上接python自动化办公&#xff08;一&#xff09; 文章目录文件和目录操作使用shutil库文件查找globfnmatchhashlib文件和目录操作 使用shutil库 shutil库也是Python标准库&#xff0c;它可以处理文件、文件夹、压缩包&#xff0c;能实现文件复制、移动、压缩、解压缩等功能。…...

Qt Quick - GridLayout 网格布局

GridLayout 理论总结一、概述二、依赖属性三、例子1. 不含跨行的2. 带跨行列的3. 从右到左一、概述 GridLayout 是最常用的布局器&#xff0c;也叫网格布局器&#xff0c;如果网格布局被调整大小&#xff0c;布局中的所有 Item 将被重新排列。它类似于基于widget的QGridLayout…...

安卓手机也可以使用新必应NewBing

没有魔法安卓手机也可以使用新必应NewBing 目前知道的是安卓手机 安卓手机先安装一个猴狐浏览器 打开手机自带浏览器&#xff0c;搜索关键词&#xff1a;猴狐浏览器&#xff0c;找到官网 也可以直接复制这个网址 狐猴浏览器 lemurbrowser CoolAPK 我的手机是荣耀安卓手机…...

支付系统设计:消息重试组件封装

文章目录前言一、重试场景分析一、如何实现重试1. 扫表2. 基于中间件自身特性3. 基于框架4. 根据公司业务特性自己实现的重试二、重试组件封装1. 需求分析2. 模块设计2.1 持久化模块1. 表定义2. 持久化接口定义3. 持久化配置类2.2 重试模块1.启动2.重试3. 业务端使用1. 引入依赖…...

Visual Studio 2022 c#中很实用的VS默认快捷键和原生功能

常常使用VS感觉还是有必要掌握其默认的快捷键&#xff0c;我这个人比较懒&#xff0c;不喜欢动不动就去设置快捷键&#xff0c;系统有就用&#xff0c;记住了就可以到处用&#xff0c;问题是像我们这种有很多个工作场所的人不可能每台电脑都去配置一下快键键。实际上我使用3dma…...

Python的30个编程技巧

1. 原地交换两个数字 Python 提供了一个直观的在一行代码中赋值与交换&#xff08;变量值&#xff09;的方法&#xff0c;请参见下面的示例&#xff1a; x,y 10,20 print(x,y) x,y y,x print(x,y) #1 (10, 20) #2 (20, 10) 赋值的右侧形成了一个新的元组&#xff0c;左侧立即解…...

MySQL:JDBC

什么是JDBC&#xff1f; JDBC( Java DataBase Connectivity ) 称为 Java数据库连接 &#xff0c;它是一种用于数据库访问的应用程序 API &#xff0c;由一组用Java语言编写的类和接口组成&#xff0c;有了JDBC就可以 用统一的语法对多种关系数据库进行访问&#xff0c;而不用担…...

C++【list容器模拟实现函数解析】

list容器&&模拟实现函数解析 文章目录list容器&&模拟实现函数解析一、list容器使用介绍二、list容器模拟实现及函数解析2.1 list结构体创建2.2 迭代器封装2.21 构造函数&#xff1a;2.22 前置和后置及- -2.23 解引用2.24 判断相等2.25 箭头重载2.26 第二个和第…...

(Java)试题 算法提高 约数个数

一、题目 &#xff08;1&#xff09;资源限制 内存限制&#xff1a;512.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s &#xff08;2&#xff09;输入 输入一个正整数N &#xff08;3&#xff09;输出 N有几个约数 &a…...

魔法反射--java反射初入门(基础篇)

&#x1f473;我亲爱的各位大佬们好&#x1f618;&#x1f618;&#x1f618; ♨️本篇文章记录的为 java反射初入门 相关内容&#xff0c;适合在学Java的小白,帮助新手快速上手,也适合复习中&#xff0c;面试中的大佬&#x1f649;&#x1f649;&#x1f649;。 ♨️如果文章有…...

概率统计_协方差的传播 Covariance Propagation

1. 方差的传播 误差的传播是指分析在形如的关系中,参量误差(x)对变量误差(y)的影响有多大。误差的传播与函数的微分紧密相关,本质是在利用当Δ x 不大时,。 方差计算公式: X为变量,为总体均值,N为总体例数。求变量X与均值的差的平方再求平均值,即得到方差。方差…...

大学生考研的意义?

当我拿起笔头&#xff0c;准备写这个话题时&#xff0c;心里是非常难受的&#xff0c;因为看到太多的学生在最好的年华&#xff0c;在自由的大学本应该开拓知识&#xff0c;提升认知&#xff0c;动手实践&#xff0c;不断尝试和试错&#xff0c;不断历练自己跳出学生思维圈&…...

【C++笔试强训】第三十一天

&#x1f387;C笔试强训 博客主页&#xff1a;一起去看日落吗分享博主的C刷题日常&#xff0c;大家一起学习博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a;夜色难免微凉&#xff0c;前方必有曙光 &#x1f31e;。 选择题 &#x…...

toString()、equals()是什么,为啥需要重写,多种方法来重写

https://m.runoob.com/java/java-object-class.html toString() 1.为什么会有toString 子类继承父类就可以使用父类所有非私有的属性的方法。 在Java中所有类都直接或者间接继承Object类&#xff0c;可以说只要是Object类里面定义的非私有的属性和方法&#xff0c;任何类都可…...

家装材料清单中会有哪些装饰材料?

在家居装修中&#xff0c;业主可以根据装修公司出具的材料清单去一一采购&#xff0c;这样不至于有遗漏&#xff0c;就算采用全包的方式&#xff0c;通过材料清单也可以大致了解当时房子装修所用的材料&#xff0c;补充自己的装修知识。下面跟随小编一起了解下房子装修材料中所…...

今天国内重大新闻事件/重庆seo搜索引擎优化优与略

一、数据与文字的表示方法 (1) 数据格式 &#xff08;1&#xff09; 定点数的表示方法 假设用一个 n&#xff0b;1 位的字来表示一个定点数 x&#xff0c;xn 放在最左位置&#xff0c;并用数值 0 和 1 分别代表正号和负号&#xff0c;其余位数代表它的量值&#xff0c;小数点…...

知乎 wordpress插件/网络营销外包推广价格

Topic 如果交换字符串 X 中的两个不同位置的字母&#xff0c;使得它和字符串 Y 相等&#xff0c;那么称 X 和 Y 两个字符串相似。如果这两个字符串本身是相等的&#xff0c;那它们也是相似的。 例如&#xff0c;“tars” 和 “rats” 是相似的 (交换 0 与 2 的位置)&#xff1b…...

做视频网站收入/推广引流吸引人的标题

g的编译选项介绍&#xff1a; -WI的理解&#xff0c;gcc的-WI,xxx选项似乎是在 gcc 中使用 ld 链接选项时候的编译器选项 -L: “链接” 的时候&#xff0c;去找的链接库的目录 - rpath&#xff08;或 - R &#xff0c;这似乎是一个内容&#xff09;&#xff0c;意思是“运行…...

浏览器做单页网站项目/百度排名优化工具

安装 Linux 主机时,如果选择 最小化安装! 配置 vnc 远程桌面可以参考:Linux 配置 VNC 远程桌面 使用 vnc 等工具连接通常显示如下: 也就是无法使用图形化界面,可以通过 yum 直接安装图形化界面: Linux 6: yum groupinstall -y "X Window System" yum gr…...

电子政务门户网站建设的教训/怎么注册一个自己的网址

paip. 混合编程的实现resin4 (自带Quercus &#xff09; 配置 php 环境#---混合编程的类型1.代码inline 方式2.使用库/api 解析方式.#----配置resin 支持phpresin4默认自动支持php..也能手动配置了.web.xml加php的servlet解析..参考Quercus让你的PHP开心在Servlet容器奔跑#---…...

大连普兰店网站建设/企业网站建站模板

wiki 地址&#xff1a;http://wiki.apache.org/solr/FrontPage&#xff0c; 里面有各个参数详细的介绍。 一.基本查询 q 查询的关键字&#xff0c;此参数最为重要&#xff0c;例如&#xff0c;qid:1&#xff0c;默认为q*:*&#xff0c; fl 指定返回哪些字段&#xff0c;用逗号…...