1. 程式人生 > >2019網易秋招筆試 程式設計題:塔

2019網易秋招筆試 程式設計題:塔

題目

小易有一些立方體,每個立方體的邊長為1,他用這些立方體搭了一些塔。
現在小易定義:這些塔的不穩定值為它們之中最高的塔與最低的塔的高度差。
小易想讓這些塔儘量穩定,所以他進行了如下操作:每次從某座塔上取下一塊立方體,並把它放到另一座塔上。
注意,小易不會把立方體放到它原本的那座塔上,因為他認為這樣毫無意義。
現在小易想要知道,他進行了不超過k次操作之後,不穩定值最小是多少。

輸入描述

第一行兩個數n,k (1 <= n <= 100, 0 <= k <= 1000)表示塔的數量以及最多操作的次數。
第二行n個數,ai(1 <= ai <= 104)表示第i座塔的初始高度。

輸出描述

第一行兩個數s, m,表示最小的不穩定值和操作次數(m <= k)
接下來m行,每行兩個數x,y表示從第x座塔上取下一塊立方體放到第y座塔上。

示例

輸入

3 2
5 8 5

輸出

0 2
2 1
2 3

思路和程式碼

# -*- coding: utf-8 -*-
'''
思路: 其實很簡單,每次排個序,然後從最大堆往最小堆搬一個即可,
     並記錄堆序號,直到最大堆-最小堆<1 或者 移動次數達到k。
     這裡排序並保留堆序號的方法,是用的python內建的sort()函式,
     當然也可以呼叫 numpy的argsort()。
'''
# 為後面排序定義一個方法 def by_value(t): return t[1] # 讀入資料 n,k = list(map(int, input().split())) A = list(map(int, input().split())) # A = [a1,a2,a3,...an] #n,k = [3,2] #A = [5,8,5] # A_ = [[1, 5], [2, 8], [3, 5]] 其中每個元素表示:[第i堆,對應塔數] A_ = [list(i) for i in zip(range(1,len(A)+1),A)] # 先對A_從大到小排一次序 sorted_A = sorted(A_,key = by_value,reverse=True
) count = 0 move_record = [] # 快取搬移的記錄 while sorted_A[0][1]-1 >= sorted_A[-1][1]+1 and count+1<=k: max_index = sorted_A[0][0] min_index = sorted_A[-1][0] sorted_A[0][1] -= 1 # 從最多堆搬走一個 sorted_A[-1][1] += 1 # 往最少堆搬來一個 count += 1 move_record.append([max_index,min_index]) sorted_A = sorted(sorted_A,key = by_value,reverse=True) # 列印結果 s = sorted_A[0][1]-sorted_A[-1][1] # s:最小的不穩定值,即最小的差 print('{} {}'.format(s,count)) for i in move_record: print('{} {}'.format(i[0],i[1]))

執行時間:50 ms
佔用記憶體:3684K
牛客網