网易2018校招(秋招)算法编程题之一-求经过K次操作的不稳定值及操作过程

题目描述:

用一些立方体堆成一些塔

定义:不稳定值为这些塔中最高的塔和最低的塔的高度差

为了让这些塔尽量稳定,进行如下操作:每次从某座塔上取下一块立方体,并放到另一座塔上

注意:不能放到原塔上

输入描述:

第一行两个数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

 

猜你喜欢

转载自blog.csdn.net/scottzeg/article/details/81589025
今日推荐