文章目录

  • 1. 题目
  • 2. 解题

1. 题目

给你 n 个任务和 m 个工人。每个任务需要一定的力量值才能完成,需要的力量值保存在下标从 0 开始的整数数组 tasks 中,第 i 个任务需要 tasks[i] 的力量才能完成。
每个工人的力量值保存在下标从 0 开始的整数数组 workers 中,第 j 个工人的力量值为 workers[j]
每个工人只能完成 一个 任务,且力量值需要 大于等于 该任务的力量要求值(即 workers[j] >= tasks[i] )。

除此以外,你还有 pills 个神奇药丸,可以给 一个工人的力量值 增加 strength 。你可以决定给哪些工人使用药丸,但每个工人 最多 只能使用 一片 药丸。

给你下标从 0 开始的整数数组 tasks 和 workers 以及两个整数 pills 和 strength ,请你返回 最多 有多少个任务可以被完成。

示例 1:
输入:tasks = [3,2,1], workers = [0,3,3], pills = 1, strength = 1
输出:3
解释:
我们可以按照如下方案安排药丸:
- 给 0 号工人药丸。
- 0 号工人完成任务 2(0 + 1 >= 1)
- 1 号工人完成任务 1(3 >= 2)
- 2 号工人完成任务 0(3 >= 3)示例 2:
输入:tasks = [5,4], workers = [0,0,0], pills = 1, strength = 5
输出:1
解释:
我们可以按照如下方案安排药丸:
- 给 0 号工人药丸。
- 0 号工人完成任务 0(0 + 5 >= 5)示例 3:
输入:tasks = [10,15,30], workers = [0,10,10,10,10], pills = 3, strength = 10
输出:2
解释:
我们可以按照如下方案安排药丸:
- 给 0 号和 1 号工人药丸。
- 0 号工人完成任务 0(0 + 10 >= 10)
- 1 号工人完成任务 1(10 + 10 >= 15)示例 4:
输入:tasks = [5,9,8,5,9], workers = [1,6,4,2,6], pills = 1, strength = 5
输出:3
解释:
我们可以按照如下方案安排药丸:
- 给 2 号工人药丸。
- 1 号工人完成任务 0(6 >= 5)
- 2 号工人完成任务 2(4 + 5 >= 8)
- 4 号工人完成任务 3(6 >= 5)提示:
n == tasks.length
m == workers.length
1 <= n, m <= 5 * 10^4
0 <= pills <= m
0 <= tasks[i], workers[j], strength <= 10^9

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-number-of-tasks-you-can-assign
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 直接二分查找答案 k,选择最强的 k 个人,去完成最简单的 k 个任务(如果 k 个人能完成 k 个任务, k+1 个人则不一定能完成 k+1 个任务,具有单调性)
  • 注意判断是否可行的时候,要先遍历难的任务(如,任务3,5,人1, 3,药2,力量3,如果顺序遍历任务,任务3被人3完成,人1吃药+3无法完成任务5,如果从难到简单遍历,任务5被人3吃药+3完成,任务3被人1吃药+3完成,从难开始遍历更优)
  • 注意:multiset 自带的 lower_boundlower_bound(iter1, iter2, val)
class Solution {public:int maxTaskAssign(vector<int>& tasks, vector<int>& workers, int pills, int strength) {sort(tasks.begin(), tasks.end());sort(workers.rbegin(), workers.rend());int n = min(tasks.size(), workers.size());int ans = 0, mid, l = 0, r = n;while(l <= r){mid = (l+r)>>1;// 完成 mid 个任务if(ok(tasks, workers, mid, pills, strength)){ans = mid;l = mid+1;}elser = mid-1;}return ans;}bool ok(vector<int>& tasks, vector<int>& workers, int finish, int pills, int strength){multiset<int> w(workers.begin(), workers.begin()+finish); // 最强的finish 个 工人for(int i = finish-1; i >= 0; --i) // 先找难的任务{   int t = tasks[i];auto it = w.lower_bound(t);if(it != w.end())w.erase(it);//能直接完成else if(pills > 0){auto it1 = w.lower_bound(t-strength);if(it1 != w.end()){w.erase(it1);//吃药能完成pills--;}elsereturn false;}else return false;}return true;}
};

1308 ms 275.2 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

LeetCode 2071. 你可以安排的最多任务数目(二分查找)相关推荐

  1. LeetCode LCP 12. 小张刷题计划(二分查找)

    1. 题目 为了提高自己的代码能力,小张制定了 LeetCode 刷题计划,他选中了 LeetCode 题库中的 n 道题,编号从 0 到 n-1,并计划在 m 天内按照题目编号顺序刷完所有的题目(注 ...

  2. LeetCode 410. 分割数组的最大值(极小极大化 二分查找 / DP)

    文章目录 1. 题目 2. 解题 2.1 二分查找 2.2 DP 1. 题目 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组. 设计一个算法使得这 m 个子数组各自和 ...

  3. LeetCode 875. 爱吃香蕉的珂珂(二分查找)

    1. 题目 珂珂喜欢吃香蕉.这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉.警卫已经离开了,将在 H 小时后回来. 珂珂可以决定她吃香蕉的速度 K (单位:根/小时).每个小时,她将会选 ...

  4. LeetCode 1870. 准时到达的列车最小时速(二分查找)

    文章目录 1. 题目 2. 解题 2.1 模拟超时 2.2 二分查找 1. 题目 给你一个浮点数 hour ,表示你到达办公室可用的总通勤时间. 要到达办公室,你必须按给定次序乘坐 n 趟列车. 另给 ...

  5. LeetCode 1847. 最近的房间(排序离线计算 + 二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 一个酒店里有 n 个房间,这些房间用二维整数数组 rooms 表示,其中 rooms[i] = [roomIdi, sizei] 表示有一个房间号为 ro ...

  6. LeetCode 528. 按权重随机选择(前缀和+二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个正整数数组 w ,其中 w[i] 代表下标 i 的权重(下标从 0 开始),请写一个函数 pickIndex ,它可以随机地获取下标 i,选取下标 ...

  7. LeetCode 1642. 可以到达的最远建筑(二分查找 / 优先队列贪心)

    文章目录 1. 题目 2. 解题 2.1 二分查找 2.2 优先队列+贪心 1. 题目 给你一个整数数组 heights ,表示建筑物的高度.另有一些砖块 bricks 和梯子 ladders . 你 ...

  8. LeetCode 778. 水位上升的泳池中游泳(二分查找+dfs)

    文章目录 1. 题目 2. 解题 1. 题目 在一个 N x N 的坐标方格 grid 中,每一个方格的值 grid[i][j] 表示在位置 (i,j) 的平台高度. 现在开始下雨了.当时间为 t 时 ...

  9. LeetCode 775. 全局倒置与局部倒置(归并排序/二分查找/一次遍历)

    文章目录 1. 题目 2. 解题 2.1 归并排序求逆序度 2.2 二分查找 2.3 一次遍历 1. 题目 数组 A 是 [0, 1, ..., N - 1] 的一种排列,N 是数组 A 的长度. 全 ...

最新文章

  1. WINCE平台下C#应用程序中使用看门狗
  2. struct结构体和char型数组的相互转化
  3. JDK的bin目录下各种工具的使用说明_对不起自己,这么久没写博,抱歉
  4. Codeforces Round #462 (Div. 2) C. A Twisty Movement dp + 思维转换
  5. 兵团职称计算机准考证查询,兵团初级会计准考证打印入口官网
  6. socket网络编程--epoll小结
  7. python函数时间,python之时间函数
  8. 网站左角悬浮图双十一抢红包活动代码
  9. 挺过最艰难的2018,我终将长大
  10. 黑苹果声卡、电池驱动
  11. 基于基因组数据的癌症亚型发现聚类研究
  12. dimens文件生成器使用方法
  13. 【微信小程序开发日记01】和风天气OUC之初步构想
  14. 医学图像笔记(一)dicom数据格式
  15. [SHOI2017]期末考试
  16. cisco交换机trunk与switchport access vlan vlan-id共存的问题
  17. 广东惠州港口吞吐量稳中有升
  18. 问题:如何查询宇视摄像机/摄像头规格参数
  19. 【深度学习】什么是解耦?
  20. sql developer使用技巧,快捷键

热门文章

  1. 深度学习之卷积神经网络(Convolutional Neural Networks, CNN)(二)
  2. 机器学习之 sklearn.preprocessing 模块
  3. linux运维适合女生么,女生真的不适合做IT行业吗?Linux运维适合女生学习吗?
  4. python pip本地安装包_python-pip install 安装包
  5. S5PV210的地址映射图
  6. Oracle client 安装、配置
  7. less is more,so 只记 less
  8. 深入解析hostname
  9. USB设备驱动之设备初始化(设备枚举)
  10. (十九)java多线程之ForkJoinPool