• 算法题15 安排机器 牛客网,腾讯笔试题


    算法题15 安排机器 牛客网,腾讯笔试题

    链接:https://www.nowcoder.com/questionTerminal/42e7ff5c5696445ab907caff17fc9e15
    来源:牛客网

    小Q的公司最近接到m个任务, 第i个任务需要xi的时间去完成, 难度等级为yi。
    小Q拥有n台机器, 每台机器最长工作时间zi, 机器等级wi。
    对于一个任务,它只能交由一台机器来完成, 如果安排给它的机器的最长工作时间小于任务需要的时间, 则不能完成,如果完成这个任务将获得200 * xi + 3 * yi收益。

    对于一台机器,它一天只能完成一个任务, 如果它的机器等级小于安排给它的任务难度等级, 则不能完成。

    小Q想在今天尽可能的去完成任务, 即完成的任务数量最大。如果有多种安排方案,小Q还想找到收益最大的那个方案。小Q需要你来帮助他计算一下。

    输入描述:
    输入包括N + M + 1行,
    输入的第一行为两个正整数n和m(1 <= n, m <= 100000), 表示机器的数量和任务的数量。
    接下来n行,每行两个整数zi和wi(0 < zi < 1000, 0 <= wi <= 100), 表示每台机器的最大工作时间和机器等级。
    接下来的m行,每行两个整数xi和yi(0 < xi < 1000, 0 <= yi<= 100), 表示每个任务需要的完成时间和任务的难度等级。


    输出描述:
    输出两个整数, 分别表示最大能完成的任务数量和获取的收益。
    示例1

    输入

    1 2
    100 3
    100 2
    100 1

    输出

    1 20006

    解题代码:

    # -*- coding:utf-8 -*-
    
    #python2.7
    n,m=[int(i) for i in raw_input().strip().split()]
    machines,tasks=[],[]
    for i in range(n):
        hours,level=[int(i) for i in raw_input().strip().split()]
        machines.append([hours,level])
    
    for i in range(m):
        hours,level=[int(i) for i in raw_input().strip().split()]
        tasks.append([hours,level])
    
    machines.sort(key=lambda x: (x[0],x[1]),reverse=True)
    tasks.sort(key=lambda x: (x[0],x[1]),reverse=True)
    
    dp=[0 for i in range(101)]
    j=0
    count=0
    res=0
    for tktime,tklev in tasks:
        while j<len(machines) and machines[j][0]>=tktime:
            dp[machines[j][1]]+=1
            j+=1
        
        for i in range(tklev,101):
            if dp[i]>0:
                dp[i]-=1
                res += 200*tktime+3*tklev
                count+=1
                break
    print("%d %d" %(count,res))
  • 相关阅读:
    java的学习笔记
    tomcat配置方法
    《编写高质量代码》学习笔记
    Servlet的学习笔记
    Http协议的学习笔记
    树莓派开箱使用分享以及一些心得
    树莓派的骚操作
    Linux的学习笔记
    msyql高级的学习笔记
    项目业务记录
  • 原文地址:https://www.cnblogs.com/yanmk/p/9313580.html
Copyright © 2020-2023  润新知