网易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

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值