题解 | #质检员的烦恼#写了一天,还是时间复杂度太高,真的心累。求高手改!!!

质检员的烦恼

http://www.nowcoder.com/questionTerminal/c60bd75f43f2439a9bfcdb3db18cabfb

# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 计算质检员每轮应该如何选择正整数K,才能在运气最差的情况下用最短的时间找到不合格的手机?并输出该最短的时间。
# @param n int整型 手机个数N
# @param a int整型 单个移动时间A
# @param b int整型 单组称重时间B
# @return long长整型
#
import math
import itertools
class Solution:
    def minTime(self , n: int, a: int, b: int) -> int:
        # write code here
        dp = [0] * (n + 1)
        dp[1] = a + b  # 单个手机:移动+称重
        dp[2] = 2 * (a + b)

        for i in range(3, int((n+1)/2)+1):
            dp[i] = i*(a+b)
            precost = i * a
            for groups in range(2, int(i/2)+1):
                cost = precost + groups * b  # 当前轮次成本:移动+称重
                if cost > dp[i]:
                    continue
                # 最坏情况下的下一轮的组大小
                maxGroupSize = (i + groups - 1) // groups if i > groups else 0
                # 最坏情况下的下一轮成本,如果组大小小于i,则为dp[maxGroupSize]的值,否则为0
                nextMaxGroupCost = dp[maxGroupSize]
                totalCost = cost + nextMaxGroupCost  # 总成本:当前成本+最坏情况下的下一轮成本
                dp[i] = min(dp[i], totalCost)  # 更新最小成本

        precost = n * a
        dp[n]=n*(a+b)
        for groups in range(2, int((n+1)/2)+1):
                cost = precost + groups * b  # 当前轮次成本:移动+称重
                # 最坏情况下的下一轮的组大小
                maxGroupSize = (n + groups - 1) // groups if n > groups else 0
                # 最坏情况下的下一轮成本,如果组大小小于i,则为dp[maxGroupSize]的值,否则为0
                nextMaxGroupCost = dp[maxGroupSize]
                totalCost = cost + nextMaxGroupCost  # 总成本:当前成本+最坏情况下的下一轮成本
                dp[n] = min(dp[n], totalCost)  # 更新最小成本

        return dp[n]


已知如果求dp[100]的话,只需要求dp[50],不需要dp[99]那些,因为肯定最少也是对半分吧。但是代码实在不会改了,哪位高手改一下吧

全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务