美团笔试(算法)程序题第二题,排序。

第一步:求总共的小盒子数量。
第二步:将盒子容量快速排序,并相应的更新已装盒子的顺序(快速排序应该用其他方法方法替换,实际上不用全部排序)
第三步:并贪心计算出需要的盒子数量k,得到选择的盒子中的最小的盒子容量xmin
第四步:将盒子容量等于xmin的盒子按照已装小盒子的数量逆序排列。需要的秒数t为第k+1到第n个盒子中装的小盒子的数量
第五步:输出k,t
遗憾的是没能按时提交,还差5分钟就可以检查出错误了。题目很简单,这个方法也肯定是比较粗糙的方法。没能按时完成,归根结底还是程序写少了。
import sys
import random
def quickSort(nums, value, l, r ):
    """快速排序一组一维数组"""
    if l >= r:
        return nums,value
    
    p = partition(nums, value, l, r)
    quickSort(nums, value, l, p-1)
    quickSort(nums, value, p+1, r)
    return nums, value

def partition(nums, value, l, r):
    """
    遍历,交换,两个指针
    对nums[l,...,r]进行partition操作
    返回p,使得arr[l,...,p-1] <= arr[p]; arr[p+1,...,r] > arr[p]
    """
    k = random.randint(l+1,r)
    nums[l], nums[k] = nums[k], nums[l]
    value[l], value[k] = value[k], value[l]
    v = nums[l]  
    i = l+1    # arr[l+1,...,i) < v 
    j = r      # arr(j,...,r] > v
    while True:
        while (i <= r) and  (nums[i] > v):
            i +=1
        while (j >= l+1) and (nums[j] < v):
            j -=1
        if i > j:
            break
        nums[i],nums[j] = nums[j], nums[i]
        value[i], value[j] = value[j], value[i]
        i +=1
        j -=1
    nums[l],nums[j] = nums[j], nums[l]
    value[l], value[j] = value[j], value[l]
    return j

if __name__ == "__main__":
    # 读取第一行的n
#    n = int(sys.stdin.readline().strip())
#    line = sys.stdin.readline().strip()
#    Y = list(map(int, line.split()))
#    line = sys.stdin.readline().strip()
#    X = list(map(int, line.split()))
    
    # 测试例子
    n = 10
    Y = [6,3,3,3,5,3,2,1,1,3]
    X = [8,6,6,6,6,4,5,4,6,6]


    sel_box = 0
    for i in range(n):
        sel_box = sel_box+Y[i]
    # X快排
    l ,r = 0, n-1
    X, Y = quickSort(X, Y, l, r)
    # 寻找k和h
    total_box = 0
    for i in range(n):
        total_box = total_box+X[i]
        if total_box >= sel_box:
            k = i
            l = i
            while (l >= 0) & (X[l] == X[i]):
                l = l - 1
            l = l+1 
            r = i
            while (r < n) & (X[r] == X[i]):
                r = r + 1
            r = r-1
            break
    Y, X = quickSort(Y, X, l, r)
    t = 0
    for i in range(k+1,n):
        t = t+Y[i]
    print(k+1,t)


#笔试题目##美团#
全部评论
我感觉求所有min 盒子那里不对。不一定是取到min那个盒子,有可能取到更后面,比如8,2,1,1,1,总容量是9
点赞 回复 分享
发布于 2019-10-16 23:30

相关推荐

05-13 02:01
已编辑
惠州学院 前端工程师
安静的少年在求佛:建议把公司名字写到标题。以后有人想搜就能直接搜到
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
05-01 13:13
ecece:这么明目张胆虚报就业率啊
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务