首页 > 其他分享 >LeetCode -- 826. 安排工作以达到最大收益

LeetCode -- 826. 安排工作以达到最大收益

时间:2023-07-12 10:35:11浏览次数:39  
标签:begin jobs difficulty -- int vector end 826 LeetCode

 

方法一:二分加枚举

通过二分快速查找小于某个难度值的最大价值。

class Solution {
public:
    int maxProfitAssignment(vector<int>& difficulty, vector<int>& profit, vector<int>& worker) {
        const int n = (int) difficulty.size();
        vector<pair<int, int>> jobs(n);
        for(int i = 0; i < n; i ++ ) {
            jobs[i] = {difficulty[i], profit[i]};
        }

        sort(jobs.begin(), jobs.end());

        int mx = jobs[0].second;
        for(int i = 0; i < n; i ++ ) {
            jobs[i].second = max(mx, jobs[i].second);
            mx = jobs[i].second;
        }

        sort(worker.begin(), worker.end());
        int res = 0, beat = 0;

        for(int i = 0; i < worker.size(); i ++ ) {
            int l = -1, r = n;
            while(l + 1 < r) {
                int mid = l + r >> 1;
                if(jobs[mid].first <= worker[i]) {
                    l = mid;
                } else {
                    r = mid;
                }
            }

            if(l != -1) {
                beat = max(beat, jobs[l].second);
                res += beat;
            }
        }

        return res;
    }
};

 

 

方法2:离散化 + 二分 + 树状数组

我们不关心某项工作的种类,我们只关心它的难度值。首先根据难度值进行离散化,再利用树状数组快速查找到低于某项难度的最大价值。

class Solution {

int tr[10010];
int n;

int lowbit(int x) {
    return x & -x;
}

void add(int p, int x) {
    for(int i = p; i <= n; i += lowbit(i)) {
        tr[i] =  max(tr[i], x);
    }
}

int query(int x) {
    int res = 0;
    for(int i = x; i; i -= lowbit(i)) {
        res = max(res, tr[i]);
    }
    return res;
}

public:
    int maxProfitAssignment(vector<int>& difficulty, vector<int>& profit, vector<int>& worker) {
        vector<int> s(difficulty.begin(), difficulty.end());
     //离散化 sort(s.begin(), s.end()); s.erase(unique(s.begin(), s.end()), s.end()); n = s.size() + 1;      //插入 for(int i = 0; i < difficulty.size(); i ++ ) { int k = lower_bound(s.begin(), s.end(), difficulty[i]) - s.begin() + 1; add(k, profit[i]); }      //找答案 int res = 0; for(auto worke : worker) { int k = upper_bound(s.begin(), s.end(), worke) - s.begin(); //upper_bound - 1为小于等于某个数的最大值 res += query(k); } return res; } };

标签:begin,jobs,difficulty,--,int,vector,end,826,LeetCode
From: https://www.cnblogs.com/zk6696/p/17546860.html

相关文章

  • 界面控件DevExpress WPF数据编辑器,让数据处理更灵活!(一)
    界面控件DevExpressWPF编辑器库可以帮助用户提供直观的用户体验,具有无与伦比的运行时选项和灵活性。WPF数据编辑器提供了全面的掩码和数据验证支持,可以独立使用,也可以作为容器控件(如DevExpressWPFGrid和WPFTreeList)中的单元格编辑器使用。DevExpressWPF拥有120+个控件和库......
  • 51单片机-跑马灯例子
    #include"reg52.h"#include"intrins.h"#include<stdio.h>typedefunsignedintu16;typedefunsignedcharu8;typedefunsignedintuint;typedefunsignedcharuchar;#defineLED_PORTP2#defineSMG_A_DP_PORTP0u8gsmg_code[17]......
  • 【NestJS系列】从Nest CLI开始入门
    初识NestJSNest是一个渐进的Node.js框架,它可以在TypeScript和JavaScript(ES6、ES7、ES8)之上构建高效、可伸缩的企业级服务器端应用程序。Nest基于TypeScript编写并且结合了OOP(面向对象编程),FP(函数式编程)和FRP(函数式响应编程)的相关理念。在设计上的很多灵感来自于......
  • SystemVerilog Dynamic Array Randomization
    https://verificationguide.com/systemverilog/systemverilog-dynamic-array-randomization/DynamicArrayRandomizeForadynamicarray,itispossibletorandomizebotharraysizeandarrayelements.randomizedynamicarraysizeInbelowexample,dynamicarr......
  • 怎么销毁单例
    staticNGUser*sharedInstance=nil;staticdispatch_once_tonceToken;+(instancetype)sharedInstance{dispatch_once(&onceToken,^{//调用父类的allocWithZone,不能使用self,避免循环引用sharedInstance=[[superallocWithZone:NULL]init];});......
  • windows事件查看器之安全事件ID汇总
    windows事件查看器之安全事件ID汇总EVENT_ID安全事件信息1100-----事件记录服务已关闭1101-----审计事件已被运输中断。1102-----审核日志已清除1104-----安全日志现已满1105-----事件日志自动备份1108-----事件日志记录服务遇到错误4608-----Windows正在启动4609......
  • 麒麟V10安装步骤
    此处是下载的服务器版,不太懂这些版本区别,就下载了兼容模式了~下载页面:https://distro-images.kylinos.cn:8802/web_pungi/download/share/HCrXv9VIWec4hwopd62Oukz7UsZBtL03/ISO镜像下载地址:https://distro-images.kylinos.cn:8802/web_pungi/download/share/HCrXv9VIWec4hwopd6......
  • 如何实现Android 隐式绑定服务的具体操作步骤
    Android隐式绑定服务Android中的服务是一种可以在后台执行长时间运行操作的组件。服务可以在后台运行,即使用户切换到其他应用或锁定设备。在Android中,服务分为两种类型:启动服务和绑定服务。启动服务是通过调用startService()方法来启动的,而绑定服务是通过调用bindService()方法来......
  • 解决Android 修改 Application uiMode monitor dark mode的具体操作步骤
    Android修改ApplicationuiModemonitordarkmode随着智能手机的普及,人们对于移动应用程序的用户界面(UI)的黑暗模式(darkmode)的需求越来越高。黑暗模式不仅能够减少屏幕亮度,保护用户的眼睛,还能节省电池电量,给用户提供更好的用户体验。在Android平台上,我们可以通过修改Applic......
  • JavaScript 将对象数组按字母顺序排序
    原文链接:JavaScript将对象数组按字母顺序排序这里给出三种解决方案:1.if条件语句+sort()2.localeCompare()+sort()3.Collator()+sort()sort用法语法array.sort(compareFunction)参数值参数描述compareFunction可选。定义替代排序顺序的函数。该函数......