网易首页 > 网易号 > 正文 申请入驻

2023-07-23:给你 n 个任务和 m 个工人 每个任务需要一定的

0
分享至

2023-07-23:给你 n 个任务和 m 个工人

每个任务需要一定的力量值才能完成

需要的力量值保存在下标从 0 开始的整数数组 tasks 中

第 i 个任务需要 tasks[i] 的力量才能完成

每个工人的力量值保存在下标从 0 开始的整数数组 workers 中

第 j 个工人的力量值为 workers[j]

每个工人只能完成 一个 任务

且力量值需要 大于等于 该任务的力量要求值, 即 workers[j] >= tasks[i]

除此以外,你还有 pills 个神奇药丸

可以给 一个工人的力量值 增加 strength

你可以决定给哪些工人使用药丸

但每个工人 最多 只能使用 一片 药丸。

给你下标从 0 开始的整数数组tasks 和 workers 以及

两个整数 pills 和 strength ,请你返回 最多 有多少个任务可以被完成。

来自华为。

输入:tasks = [3,2,1], workers = [0,3,3], pills = 1, strength = 1。

输出:3。

答案2023-07-23:

maxTaskAssign1:

1.对任务数组 tasks 和工人数组 workers 进行升序排序。

2.使用二分查找在任务数组 tasks 中找到一个索引 m,使得从 tasks[0] 到 tasks[m-1] 的任务可以被 workers[len(workers)-m] 到 workers[len(workers)-1] 完成。

3.判断使用药丸后,从 tasks[m] 到 tasks[len(tasks)-1] 的剩余任务是否能够被剩余的工人完成。

4.如果可以完成,则继续在右半部分寻找更大的 m 值;如果无法完成,则在左半部分寻找更小的 m 值。

5.返回最终的 m 值,即最多可以完成的任务数。

maxTaskAssign2:

1.对任务数组 tasks 和工人数组 workers 进行升序排序。

2.使用二分查找在任务数组 tasks 中找到一个索引 m,使得从 tasks[0] 到 tasks[m-1] 的任务可以被 workers[len(workers)-m] 到 workers[len(workers)-1] 完成。

3.使用辅助数组 help 存储满足条件的任务索引。

4.从 workers[wl] 到 workers[wr] 遍历每个工人,依次分配任务。

5.在任务数组 tasks 中,使用双指针 l 和 r,将满足 workers[wi] <= tasks[help[l]] <= workers[wi]+strength 的任务指针存入 help 数组。

6.如果 l < r,则说明有任务可以被工人完成,将任务数加一,并将 r 减一。

7.如果 l >= r,则说明无法完成任务,返回一个很大的值。

8.返回最终的任务数。

算法maxTaskAssign1的时间复杂度为O(n log n + m log m),空间复杂度为O(n + m)。

算法maxTaskAssign2的时间复杂度为O((n + m) log n),空间复杂度为O(n)。

go完整代码如下:

packagemain
import(
"fmt"
"sort"
)
funcmaxTaskAssign1(tasks[]int,workers[]int,pillsint,strengthint)int{
l:=0
r:=len(tasks)
varm,ansint
sort.Ints(tasks)
sort.Ints(workers)
forl<=r{
m=(l+r)/2
ifyeah1(tasks,0,m-1,workers,len(workers)-m,len(workers)-1,strength)<=pills{
ans=m
l=m+1
}else{
r=m-1
}
}
returnans
}
funcyeah1(tasks[]int,tlint,trint,workers[]int,wlint,wrint,strengthint)int{
ifwl<0{
returnint(^uint(0)>>1)
}
taskMap:=make(map[int]int)
fori:=tl;i<=tr;i++{
taskMap[tasks[i]]++
}
varansint
fori:=wl;i<=wr;i++{
job:=floorKey(taskMap,workers[i])
ifjob!=nil{
times:=taskMap[*job]
iftimes==1{
delete(taskMap,*job)
}else{
taskMap[*job]--
}
}else{
job=floorKey(taskMap,workers[i]+strength)
ifjob==nil{
returnint(^uint(0)>>1)
}
ans++
times:=taskMap[*job]
iftimes==1{
delete(taskMap,*job)
}else{
taskMap[*job]--
}
}
}
returnans
}
funcfloorKey(taskMapmap[int]int,keyint)*int{
floorKey:=-1
fork:=rangetaskMap{
ifk>floorKey&&k<=key{
floorKey=k
}
}
iffloorKey==-1{
returnnil
}
return&floorKey
}
funcmaxTaskAssign2(tasks[]int,workers[]int,pillsint,strengthint)int{
help:=make([]int,len(tasks))
l:=0
r:=len(tasks)
varm,ansint
sort.Ints(tasks)
sort.Ints(workers)
forl<=r{
m=(l+r)/2
ifyeah2(tasks,0,m-1,workers,len(workers)-m,len(workers)-1,strength,help)<=pills{
ans=m
l=m+1
}else{
r=m-1
}
}
returnans
}
funcyeah2(tasks[]int,tlint,trint,workers[]int,wlint,wrint,strengthint,help[]int)int{
ifwl<0{
returnint(^uint(0)>>1)
}
l:=0
r:=0
ti:=tl
varansint
forwi:=wl;wi<=wr;wi++{
for;ti<=tr&&tasks[ti]<=workers[wi];ti++{
help[r]=ti
r++
}
ifll++
}else{
for;ti<=tr&&tasks[ti]<=workers[wi]+strength;ti++{
help[r]=ti
r++
}
iflans++
r--
}else{
returnint(^uint(0)>>1)
}
}
}
returnans
}
funcmain(){
tasks:=[]int{3,2,1}
workers:=[]int{0,3,3}
pills:=1
strength:=1
fmt.Println("maxTaskAssign1:",maxTaskAssign1(tasks,workers,pills,strength))
fmt.Println("maxTaskAssign2:",maxTaskAssign2(tasks,workers,pills,strength))
}

rust完整代码如下:

usestd::collections::BTreeMap;
fnmax_task_assign1(tasks:Vec,workers:Vec,pills:i32,strength:i32)->i32{
letmutl=0;
letmutr=tasks.len();
letmutans=0;
letmutsorted_tasks=tasks.clone();
sorted_tasks.sort();
letmutsorted_workers=workers.clone();
sorted_workers.sort();
whilel<=r{
letm=(l+r)/2;
ifyeah1(
&sorted_tasks,
0,
m-1,
&sorted_workers,
workers.len()-m,
workers.len()-1,
strength,
)<=pills
{
ans=masi32;
l=m+1;
}else{
r=m-1;
}
}
ans
}
fnyeah1(
tasks:&[i32],
tl:usize,
tr:usize,
workers:&[i32],
wl:usize,
wr:usize,
strength:i32,
)->i32{
ifwl>=workers.len(){
returni32::max_value();
}
letmuttask_map=BTreeMap::new();
foriintl..=tr{
*task_map.entry(tasks[i]).or_insert(0)+=1;
}
letmutans=0;
foriinwl..=wr{
letjob=matchtask_map.range(..=workers[i]).rev().next(){
Some((key,_))=>*key,
None=>{
letjob=matchtask_map.range(..=(workers[i]+strength)).rev().next(){
Some((key,_))=>*key,
None=>returni32::max_value(),
};
ans+=1;
job
}
};
lettimes=task_map.get(&job).cloned().unwrap();
iftimes==1{
task_map.remove(&job);
}else{
task_map.insert(job,times-1);
}
}
ans
}
fnmax_task_assign2(tasks:Vec,workers:Vec,pills:i32,strength:i32)->i32{
letmuthelp=vec![0;tasks.len()];
letmutl=0;
letmutr=tasks.len();
letmutans=0;
letmutsorted_tasks=tasks.clone();
sorted_tasks.sort();
letmutsorted_workers=workers.clone();
sorted_workers.sort();
whilel<=r{
letm=(l+r)/2;
ifyeah2(
&sorted_tasks,
0,
m-1,
&sorted_workers,
workers.len()-m,
workers.len()-1,
strength,
&muthelp,
)<=pills
{
ans=masi32;
l=m+1;
}else{
r=m-1;
}
}
ans
}
fnyeah2(
tasks:&[i32],
tl:usize,
tr:usize,
workers:&[i32],
wl:usize,
wr:usize,
strength:i32,
help:&mut[i32],
)->i32{
ifwl>=workers.len(){
returni32::max_value();
}
letmutl=0;
letmutr=0;
letmutti=tl;
letmutans=0;
forwiinwl..=wr{
whileti<=tr&&tasks[ti]<=workers[wi]{
help[r]=tiasi32;
r+=1;
ti+=1;
}
ifll+=1;
}else{
whileti<=tr&&tasks[ti]<=workers[wi]+strength{
help[r]=tiasi32;
r+=1;
ti+=1;
}
iflans+=1;
r-=1;
}else{
returni32::max_value();
}
}
}
ans
}
fnmain(){
lettasks=vec![3,2,1];
letworkers=vec![0,3,3];
letpills=1;
letstrength=1;
letresult1=max_task_assign1(tasks.clone(),workers.clone(),pills,strength);
letresult2=max_task_assign2(tasks,workers,pills,strength);
println!("max_task_assign1result:{}",result1);
println!("max_task_assign2result:{}",result2);
}

c++代码如下:

#include
#include
#include
#include
usingnamespacestd;
intyeah1(vector&tasks,inttl,inttr,vector&workers,intwl,intwr,intstrength){
if(wl<0){
returnINT_MAX;
}
maptaskMap;
for(inti=tl;i<=tr;i++){
taskMap[tasks[i]]++;
}
intans=0;
for(inti=wl;i<=wr;i++){
autojob=taskMap.lower_bound(workers[i]);
if(job!=taskMap.end()){
inttimes=job->second;
if(times==1){
taskMap.erase(job);
}
else{
job->second--;
}
}
else{
job=taskMap.lower_bound(workers[i]+strength);
if(job==taskMap.end()){
returnINT_MAX;
}
ans++;
inttimes=job->second;
if(times==1){
taskMap.erase(job);
}
else{
job->second--;
}
}
}
returnans;
}
intmaxTaskAssign1(vector&tasks,vector&workers,intpills,intstrength){
intl=0;
intr=tasks.size();
intm,ans=0;
sort(tasks.begin(),tasks.end());
sort(workers.begin(),workers.end());
while(l<=r){
m=(l+r)/2;
if(yeah1(tasks,0,m-1,workers,workers.size()-m,workers.size()-1,strength)<=pills){
ans=m;
l=m+1;
}
else{
r=m-1;
}
}
returnans;
}
intyeah2(vector&tasks,inttl,inttr,vector&workers,intwl,intwr,intstrength,vector&help){
if(wl<0){
returnINT_MAX;
}
intl=0;
intr=0;
intti=tl;
intans=0;
for(intwi=wl;wi<=wr;wi++){
for(;ti<=tr&&tasks[ti]<=workers[wi];ti++){
help[r++]=ti;
}
if(ll++;
}
else{
for(;ti<=tr&&tasks[ti]<=workers[wi]+strength;ti++){
help[r++]=ti;
}
if(lans++;
r--;
}
else{
returnINT_MAX;
}
}
}
returnans;
}
intmaxTaskAssign2(vector&tasks,vector&workers,intpills,intstrength){
vectorhelp(tasks.size());
intl=0;
intr=tasks.size();
intm,ans=0;
sort(tasks.begin(),tasks.end());
sort(workers.begin(),workers.end());
while(l<=r){
m=(l+r)/2;
if(yeah2(tasks,0,m-1,workers,workers.size()-m,workers.size()-1,strength,help)<=pills){
ans=m;
l=m+1;
}
else{
r=m-1;
}
}
returnans;
}
intmain(){
vectortasks={3,2,1};
vectorworkers={0,3,3};
intpills=1;
intstrength=1;
//intresult1=maxTaskAssign1(tasks,workers,pills,strength);
intresult2=maxTaskAssign2(tasks,workers,pills,strength);
//cout<<"ResultfrommaxTaskAssign1:"<cout<<"ResultfrommaxTaskAssign2:"<
return0;
}

c完整代码如下:

#include
#include
intyeah1(int*tasks,inttl,inttr,int*workers,intwl,intwr,intstrength){
if(wl<0){
returnINT_MAX;
}
inttaskMap[1001]={0};
for(inti=tl;i<=tr;i++){
taskMap[tasks[i]]++;
}
intans=0;
for(inti=wl;i<=wr;i++){
intjob=-1;
for(intj=workers[i];j>=0;j--){
if(taskMap[j]>0){
job=j;
break;
}
}
if(job!=-1){
taskMap[job]--;
}
else{
job=-1;
for(intj=workers[i]+strength;j>=workers[i];j--){
if(taskMap[j]>0){
job=j;
break;
}
}
if(job==-1){
returnINT_MAX;
}
ans++;
taskMap[job]--;
}
}
returnans;
}
intcompare(constvoid*a,constvoid*b){
return*(int*)a-*(int*)b;
}
intmaxTaskAssign1(int*tasks,inttasksSize,int*workers,intworkersSize,intpills,intstrength){
intl=0;
intr=tasksSize;
intm,ans=0;
int*sortedTasks=(int*)malloc(tasksSize*sizeof(int));
int*sortedWorkers=(int*)malloc(workersSize*sizeof(int));
for(inti=0;isortedTasks[i]=tasks[i];
}
for(inti=0;isortedWorkers[i]=workers[i];
}
qsort(sortedTasks,tasksSize,sizeof(int),compare);
qsort(sortedWorkers,workersSize,sizeof(int),compare);
while(l<=r){
m=(l+r)/2;
if(yeah1(sortedTasks,0,m-1,sortedWorkers,workersSize-m,workersSize-1,strength)<=pills){
ans=m;
l=m+1;
}
else{
r=m-1;
}
}
free(sortedTasks);
free(sortedWorkers);
returnans;
}
intyeah2(int*tasks,inttl,inttr,int*workers,intwl,intwr,intstrength,int*help){
if(wl<0){
returnINT_MAX;
}
intl=0;
intr=0;
intti=tl;
intans=0;
for(intwi=wl;wi<=wr;wi++){
for(;ti<=tr&&tasks[ti]<=workers[wi];ti++){
help[r++]=ti;
}
if(ll++;
}
else{
for(;ti<=tr&&tasks[ti]<=workers[wi]+strength;ti++){
help[r++]=ti;
}
if(lans++;
r--;
}
else{
returnINT_MAX;
}
}
}
returnans;
}
intmaxTaskAssign2(int*tasks,inttasksSize,int*workers,intworkersSize,intpills,intstrength){
int*help=(int*)malloc(tasksSize*sizeof(int));
intl=0;
intr=tasksSize;
intm,ans=0;
int*sortedTasks=(int*)malloc(tasksSize*sizeof(int));
int*sortedWorkers=(int*)malloc(workersSize*sizeof(int));
for(inti=0;isortedTasks[i]=tasks[i];
}
for(inti=0;isortedWorkers[i]=workers[i];
}
qsort(sortedTasks,tasksSize,sizeof(int),compare);
qsort(sortedWorkers,workersSize,sizeof(int),compare);
while(l<=r){
m=(l+r)/2;
if(yeah2(sortedTasks,0,m-1,sortedWorkers,workersSize-m,workersSize-1,strength,help)<=pills){
ans=m;
l=m+1;
}
else{
r=m-1;
}
}
free(help);
free(sortedTasks);
free(sortedWorkers);
returnans;
}
intmain(){
inttasks[]={3,2,1};
inttasksSize=sizeof(tasks)/sizeof(tasks[0]);
intworkers[]={0,3,3};
intworkersSize=sizeof(workers)/sizeof(workers[0]);
intpills=1;
intstrength=1;
intmax1=maxTaskAssign1(tasks,tasksSize,workers,workersSize,pills,strength);
intmax2=maxTaskAssign2(tasks,tasksSize,workers,workersSize,pills,strength);
printf("maxTaskAssign1:%d\n",max1);
printf("maxTaskAssign2:%d\n",max2);
return0;
}

福大大架构师每日一题

java当死,golang当立。最新面试题,涉及golang,rust,mysql,redis,云原生,算法,分布式,网络,操作系统。

612篇原创内容

福大大架构师每日一题

,赞3

896个

收录于合集#福大大架构师每日一题

上一篇2023-07-22:一共有n个项目,每个项目都有两个信息, projects[i] = {a, b}, 表示i号项目做完要a天

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
福建女子睡醒身上爆出很多红疹,还越挠越痒!近期多人中招,竟是因……

福建女子睡醒身上爆出很多红疹,还越挠越痒!近期多人中招,竟是因……

福建卫生报
2024-06-19 19:28:59
胡锡进:得饶人处且饶人,但余琦自己造成的后果得慢慢承受

胡锡进:得饶人处且饶人,但余琦自己造成的后果得慢慢承受

映射生活的身影
2024-06-19 13:49:12
证监会定调:市场运行事关上亿家庭、百商百业,极端情形时该出手就果断出手

证监会定调:市场运行事关上亿家庭、百商百业,极端情形时该出手就果断出手

每日经济新闻
2024-06-19 10:09:17
茅台的崩盘似乎根本刹不住车。

茅台的崩盘似乎根本刹不住车。

玉辞心
2024-06-19 17:17:56
北大硕士赵斌:姜萍连题目都看不懂,点名王润秋,说错愿承担后果

北大硕士赵斌:姜萍连题目都看不懂,点名王润秋,说错愿承担后果

东东趣谈
2024-06-18 17:25:07
中国发出警告:90天内不支付358亿赔偿金,18艘军舰就别想要了

中国发出警告:90天内不支付358亿赔偿金,18艘军舰就别想要了

星辰故事屋
2024-06-09 17:09:59
考公的斯坦福博士父母等情况披露!岗位限5年不能流出本乡镇

考公的斯坦福博士父母等情况披露!岗位限5年不能流出本乡镇

南方都市报
2024-06-18 19:18:05
太豪横!富二代王政源购27万的单车,穿骑行裤女性特征明显惹争议

太豪横!富二代王政源购27万的单车,穿骑行裤女性特征明显惹争议

裕丰娱间说
2024-06-19 08:05:41
天山脚下的绿洲,挂满小糖包

天山脚下的绿洲,挂满小糖包

艾格吃饱了
2024-06-18 20:07:01
炸裂!狗仔曝陈晓宁可净身出户也要离婚,已摘下婚戒,原因疑曝光

炸裂!狗仔曝陈晓宁可净身出户也要离婚,已摘下婚戒,原因疑曝光

八卦爱侃娱
2024-06-19 14:54:22
普京任命自己的侄女做国防部长说明了什么?

普京任命自己的侄女做国防部长说明了什么?

追逐手中未来
2024-06-19 08:04:56
终于来了!日本宣布介入仁爱礁冲突,中俄:不排除会击沉日本舰队

终于来了!日本宣布介入仁爱礁冲突,中俄:不排除会击沉日本舰队

史家评ing
2023-08-27 08:12:03
医学博士11天捐精5次猝死,父亲索赔400万:难道我儿不如一头牛

医学博士11天捐精5次猝死,父亲索赔400万:难道我儿不如一头牛

Enigma龙探长
2024-06-18 20:46:13
美国量子导航突破!导弹将不再依赖GPS?美方称中国在第三层次

美国量子导航突破!导弹将不再依赖GPS?美方称中国在第三层次

大国纪录
2024-06-19 11:36:45
著名女优玩偶姐姐HongKongDoll,被爆料真实面目?

著名女优玩偶姐姐HongKongDoll,被爆料真实面目?

吃瓜党二号头目
2024-06-13 10:15:52
“新冠疫苗之父”杨晓明落马!打过3针的网友瑟瑟发抖?

“新冠疫苗之父”杨晓明落马!打过3针的网友瑟瑟发抖?

天津生活通
2024-06-19 16:14:23
两教授在世界顶刊发论文均获百万重奖,是重人才还是“唯论文”?当事人回应

两教授在世界顶刊发论文均获百万重奖,是重人才还是“唯论文”?当事人回应

极目新闻
2024-06-19 11:20:27
大范围暴雨北上,蓝色大雨区进入河南山东!分析:全面对准特旱区

大范围暴雨北上,蓝色大雨区进入河南山东!分析:全面对准特旱区

中国气象爱好者
2024-06-19 14:51:46
以色列向全球发出沉痛之声!

以色列向全球发出沉痛之声!

林林爱天堂
2024-06-17 18:40:06
47万人连夜大逃亡,以色列,做梦也没想到,历史会再次重演?

47万人连夜大逃亡,以色列,做梦也没想到,历史会再次重演?

户外阿崭
2024-06-19 13:32:18
2024-06-19 22:16:49
moonfdd
moonfdd
福大大架构师每日一题
427文章数 7关注度
往期回顾 全部

科技要闻

618观察:谁为高强度的低价竞争买单?

头条要闻

干部沉迷"商海":我每天想的不是工作 是金钱香车美女

头条要闻

干部沉迷"商海":我每天想的不是工作 是金钱香车美女

体育要闻

欧洲杯最大的混子,非他莫属

娱乐要闻

黄一鸣“杀疯了” 直播间卖大葱养孩子

财经要闻

深化科创板改革 证监会发布八条措施

汽车要闻

双肾格栅变化大/内饰焕新 新一代宝马X3官图发布

态度原创

游戏
健康
亲子
艺术
手机

《塞尔达传说》新作截图、背景介绍:林克下落不明!

晚餐不吃or吃七分饱,哪种更减肥?

亲子要闻

产后的排瘀调理和气血调理对于妈妈来说是非常重要的#湖南王书甲

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

手机要闻

大批网友向雷军卢伟冰吐槽手机系统!王腾回应:会督促团队优化

无障碍浏览 进入关怀版