牛客刷题(网易)

牛牛找工作

import sys
# 利用HashMap来将任务升维度来降低时间复杂度
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包括了所有工作所需要的能力和所有工人的能力
    res = [0] * (n + m)
    
    # 得到每个工人的能力的数组
    abilities = list(map(int, lines[-1]))
    
    # 设立一个maps,这个maps到最后会包括无论是工作能力到报酬的映射
    # 和工人能力到报酬的映射
    # 最后形成一个能力到最大报酬的映射
    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会记录下遍历到此为止的最大报酬
    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()

跳石板

import sys
import math
# 贪心,动态规划
def main():
    sys.stdin = open("input.txt", 'r')
    line = sys.stdin.readline()
    line = list(map(int, line.strip().split()))
    k = line[0]
    n = line[1]
    end = n
    dp = [float('Inf')] * (n + 1)
    dp[k] = 0
    for i in range(k, n):
        # 如果是Inf说明这个地方跳不到
        if dp[i] == float('Inf'):
            continue
        # 在[2~math.sqrt(i)]遍历查找i的约数
        for j in range(2, int(math.sqrt(i)) + 1):

            # j是约数
            if i % j == 0:
                if i + j <= end:
                    dp[i + j] = min(dp[i + j], 1 + dp[i])
                # i//j是和j对称的约数
                if i + i//j <= end:
                    dp[i + i//j] = min(dp[i + i//j], 1 + dp[i])
    if dp[-1] != float('Inf'):
        print(dp[-1])
    else:
        print(-1)

if __name__ == '__main__':
    main()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值