题目描述:
用一些立方体堆成一些塔
定义:不稳定值为这些塔中最高的塔和最低的塔的高度差
为了让这些塔尽量稳定,进行如下操作:每次从某座塔上取下一块立方体,并放到另一座塔上
注意:不能放到原塔上
输入描述:
第一行两个数n,k(1<=n<=100, 1<=k<=1000)表示塔的数量以及最多操作次数
第二行n个数,ai(1<=ai<=10^4)表示第i座塔的初始高度
输出描述:
第一行两个数s,m,表示最小的不稳定值和操作次数(m<=k)
接下来的m行,每行两个数x,y表示从第x座塔上取下一块立方体放到第y座塔上
示例:
输入
3 2
5 8 5
输出
0 2
2 1
2 3
思路:
先定义一个更新塔高度的函数,输入为所有塔的高度,输出为更新操作之后塔的高度,以及操作后的不稳定值,操作过程
再定义一个小于操作数的范围,去进行迭代更新,终止条件为不稳定值为0或者操作数等于允许最大操作数
代码如下:
# -*- coding:utf-8 -*-
import numpy as np
class Solution:
### 迭代操作
def Find(self, tower, values):
# write code here
a = np.zeros((values[1]))
b = np.zeros((values[1]))
for i in range(values[1]):
tower, value, a[i], b[i] = s.update(tower)
if value == 0:
return i+1, value, a, b
return values[1], value, a, b
### 更新塔高度 并返回更新操作之后塔的高度,以及操作后的不稳定值,操作过程
def update(self, tower):
maxinum = max(tower)
mininum = min(tower)
maxindex = tower.index(maxinum)
minindex = tower.index(mininum)
tower[maxindex], tower[minindex] = maxinum-1, mininum+1
return tower, max(tower)-min(tower), maxindex, minindex
while True:
try:
s = Solution()
### 数据输入 与 处理
values = input()
tower = input()
values = values.split(' ')
tower = tower.split(' ')
values[0], values[1] = eval(values[0]), eval(values[1])
for i in range(values[0]):
tower[i] = eval(tower[i])
### 计算
opra_num, num, x, y = s.Find(tower, values)
### 输出
print(num, opra_num)
for i in range(opra_num):
print((int(x[i])+1), (int(y[i])+1))
except:
break