首页 > 试题广场 >

牛牛找工作

[编程题]牛牛找工作
  • 热度指数:132799 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬。牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作。在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作,牛牛依然使用自己的标准来帮助小伙伴们。牛牛的小伙伴太多了,于是他只好把这个任务交给了你。

输入描述:
每个输入包含一个测试用例。
每个测试用例的第一行包含两个正整数,分别表示工作的数量N(N<=100000)和小伙伴的数量M(M<=100000)。
接下来的N行每行包含两个正整数,分别表示该项工作的难度Di(Di<=1000000000)和报酬Pi(Pi<=1000000000)。
接下来的一行包含M个正整数,分别表示M个小伙伴的能力值Ai(Ai<=1000000000)。
保证不存在两项工作的报酬相同。


输出描述:
对于每个小伙伴,在单独的一行输出一个正整数表示他能得到的最高报酬。一个工作可以被多个人选择。
示例1

输入

3 3
1 100
10 1000
1000000000 1001
9 10 1000000000

输出

100
1000
1001
第二个测试用例是不是有问题
1000 1000
787000 48080
261688 160559
246542 653205
182462 270339
437198 88255
402273 412550
463665 4218
235858 342063
375285 441618
837203 728492
229395 630747
714734 921585
21232 649897
232625 739160
398941 961393
689889 740372
628207 957783
483868 592844
895223 682757
534285 908366
762675 648235
489467 436674
429740 677769
564747 390179
779494 137135
639874 829642
972498 281318
826684 184554
308239 141292
755936 288772
778437 754043
35561 565860
427841 88930
33302 162147
20964 924203
294618 340028
907140 439556
599518 183607
575145 277534
262346 713568
467217 96817
841584 413473
200869 827582
18433 377980
640794 647371
37357 952714
11944 897027
85472 385303
397558 545675
687807 886507
502428 533318
598519 934450
185424 124850
301183 300869
646186 284233
96425 542839
544536 308777
876109 222449
983595 842972
82694 60719
520687 559960
840378 106928
800959 598792
31814 319266
604327 817089
998048 237812
68824 812030
734124 443914
987279 823901
548143 587828
465854 560504
147135 725983
801378 991741
791305 154419
11076 288375
34097 410707
532096 653498
307334 438744
161897 914634
914700 407935
263570 775325
973376 302638
134278 377348
374255 465083
393538 737574
907391 460237
8454 891605
717476 190608
646823 672591
482181 184382
356864 509223
667124 985801
180508 322577
430178 93874
494022 516770
925785 537109
207025 907453
700455 481874
428768 300199
271586 754469
332415 912420
99374 952767
635440 604407
120833 553243
568568 263287
997592 976418
704663 231636
228871 964472
584636 805406
121549 526108
352982 996494
103413 982972
650811 549627
188334 630326
599189 734359
328636 445736
578048 318535
922853 478402
323422 251167
891972 511727
742156 829707
769546 275759
129258 800583
45584 904272
481502 30040
373863 345160
366041 258256
179544 165324
426201 190150
756212 918652
374750 678988
66077 755629
829117 538240
330970 70510
895087 161755
878047 143820
656051 513581
77435 208022
550816 407647
830593 982441
222748 237455
329224 774357
856848 895119
654987 822350
2143

最后一组数怎么只有一个值?不是应该1000个值吗
发表于 2021-07-14 17:32:04 回复(0)
编程新手学习中,不考虑复杂度,感觉自己这个挺对的,自建测试用例都是对的,但系统不给过。求路过大神指点一二~~

发表于 2020-04-08 15:26:24 回复(0)
 有没有大佬帮忙看下,为什么测试用例能通过,但是提交了就不行,只有10%,
j = []
while True:
    try:
        s = input()
        s = s.split()
        j.append(s)
        if s == '':
            break
    except:
        break
if j == '':
    print(0)
z = []
for i in j:
    z.append([int(c) for c in i])
dic = z[0:-1]
peop = z[-1]
d = dict(dic)
temp = 0
for i in peop:
    for j in sorted(d):
        if j > i:
            break
        if d[j] > temp:
            temp = d[j]
    print(temp)
    temp = 0
发表于 2020-03-21 23:05:13 回复(0)
import sys
lines=sys.stdin.readlines()#所有输入
DP={}
for line in lines[1:-1]:
    if not line.strip().split():
        continue
    [a,b]=map(int,line.strip().split())
    DP[a]=max(DP.get(a,0),b)(2146)#放最大的进去
job=sorted(DP.items(),key=lambda x:x[0])#对工作按要求从小到大排序
A=enumerate(map(int,lines[-1].strip().split()))(2147)#组合成一个索引序列 方便输出
A=sorted(A,key=lambda x:x[1])
N=len(job)
M=len(A)
maxv=0
index=0
res=[0]*M
for i in range(N):
    while job[i][0]>A[index][1]:#工作难度大的情况,定价并不断往后找人
        res[A[index][0]]=maxv
        index+=1
        if index>=M:(2148)#出while循环
            break
    if index>=M:#出大循环
            break
    if maxv<job[i][1]:
        maxv=job[i][1]
for i in range(index,M):(2149)#能力太高的也只能给max了
    res[A[i][0]]=maxv
for i in res:
    print(i)

发表于 2020-03-11 14:00:15 回复(0)
import sys
input_line = sys.stdin.readline().strip().split()
N = int(input_line[0])
M = int(input_line[1])
job = []
i = 0
while i < N:
    input_line = sys.stdin.readline().strip().split()
    if input_line:
        job.append(list(map(int,input_line)))
        i += 1
people = []
while len(people) != M:
    input_line = sys.stdin.readline().strip().split()
    people = list(map(int,input_line))
#按照难度要求升序排列
job = sorted(job,key = lambda x:x[0])
#对工作进行预处理加快速度
pay = []
pay.append(job[0])
for Di, Pi in job:
    if Pi > pay[-1][1]:
        pay.append([Di,Pi])
#对M个结果打印输出
b = len(pay)
for i in range(M):
    if people[i] < pay[0][0]:
        print(0)
        continue
    #二分查找,找到最后一个小于等于people[i]的位置
    l = 0
    r = b - 1
    while l < r:
        m = 1 + (l + r) // 2
        if pay[m][0] > people[i]:
            r = m - 1
        else:
            l = m
    print(pay[l][1])

发表于 2019-09-08 11:23:41 回复(0)
[N,M] = list(map(int,input().split()))
work = []
for i in range(N):
    work.append(list(map(int,input().split())))
friends = list(map(int,input().split()))
work.sort(key = lambda x:-x[1])
for i in range(M):
    candidate = [j for j in work if j[0]<=friends[i]]
    print(candidate[0][1])


这个哪里错了???通过10%
发表于 2019-09-06 17:40:03 回复(0)
谁知道这是怎么回事,根本不知道该怎么调,懵逼
发表于 2019-08-18 16:32:48 回复(0)
Job,Frid=(input()).split()
JobDi=[]
JobPi=[]
FridMO=[]
for i in range(int(Job)):
    Di,Pi=(input()).split()
    JobDi.append(Di)
    JobPi.append(Pi)
FridAi=input().split()
for n in range(int(Frid)):
    for i in range(int(Job)):
        if int(FridAi[n])>=int(JobDi[i]):
            FridMO.append(JobPi[i]) 
    FridPi=max(FridMO)
    FridMO=[]
    print(FridPi) 
发表于 2019-08-16 16:52:00 回复(0)
import sys
import collections
d = collections.OrderedDict()
line = sys.stdin.readline().strip()
n,m = map(int, line.split())
for i in range(n):
    line = sys.stdin.readline().strip()
    a, b = map(int, line.split())
    d[a] = b
f = d.items()
b = sorted(f,key = lambda k : k[0],reverse = True)
line = sys.stdin.readline().strip()
s = list(map(int,line.split()))
for j in s:
    for i in range(n):
        if j >= b[i][0]:
            print(b[i][1])
       为什么运行显示格式错误:您的程序输出的格式不符合要求(比如空格和换行与要求不一致)
   
发表于 2019-08-14 11:34:44 回复(1)

都没Python AC代码 在这里添加一个 思想还是借鉴最高票 用maps[key]表示能力值为key所能取得的最高报酬 代码如下:

import sys
def main():
    lines = sys.stdin.readlines()
    lines = [l.strip().split() for l in lines if l.strip()]
    n, m = int(lines[0][0]), int(lines[0][1])
    res = [0] * (n + m)
    abilities = list(map(int, lines[-1]))
    maps = dict()
    for index, l in enumerate(lines[1:-1]):
        d, s = int(l[0]), int(l[1])
        maps[d] = s
        res[index] = d
    for index, ability in enumerate(abilities):
        res[index + n] = ability
        if ability not in maps:
            maps[ability] = 0
    res.sort()
    maxSalary = 0
    for index in range(n + m):
        maxSalary = max(maxSalary, maps[res[index]])
        maps[res[index]] = maxSalary
    for index in range(m):
        print(maps[abilities[index]])
if __name__ == '__main__':
    main()
编辑于 2019-06-02 16:07:40 回复(2)
不知道哪里错了?貌似是输入数据读取的有问题,求大佬解答下,代码如下
import sys
line_1 = sys.stdin.readline().strip().split()
n,m = int(line_1[0]),int(line_1[1])
job={}
job1={}
for i in range(0,n):
    if len(sys.stdin.readline().strip().split()): #判断是否是空行
        continue
    line = sys.stdin.readline().strip().split()
    job[line[0]]=line[1]   #需要能力值,工资,哈希表
    job1[line[0]]=line[1]
for i in range(1):
    if len(sys.stdin.readline().strip().split()): #判断是否是空行
        continue
    emp=sys.stdin.readline().strip().split()
for num in emp:
    each_job=0
    for key,value in sorted(job.items()):
        if int(num)>=int(key):
            each_job=key
    print(job1[each_job])

报错如下:
通过率百分之10,您的代码已保存
请检查是否存在语法错误或者数组越界非法访问等情况
case通过率为10.00%
Traceback (most recent call last):
File "a.py3", line 16, in
for num in emp:
NameError: name 'emp' is not defined。

思路:读取数据,把工作值,工资放在一个哈希表里。然后对每个人的能力值进行遍历,找到最接近且小于的能力值,从哈希表中查对应的工资,输出 。

发表于 2018-04-03 11:12:48 回复(0)
先吐槽牛客网的编辑器,怎么粘贴格式都不对


编辑于 2018-03-30 11:04:37 回复(5)