美团笔试(算法)程序题第二题,排序。
第一步:求总共的小盒子数量。
第二步:将盒子容量快速排序,并相应的更新已装盒子的顺序(快速排序应该用其他方法方法替换,实际上不用全部排序)
第三步:并贪心计算出需要的盒子数量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)