Python|【网易2019年秋招笔试题】编程题第二题(香槟塔里倒香槟——参考代码和编程思路)

【网易18年校招笔试题】香槟塔里倒香槟——参考代码和编程思路

  • 【网易18年校招笔试题】香槟塔里倒香槟——参考代码和编程思路
    • 题目描述:
    • 参考案例:
    • 思路分析:
    • 编程思路:
    • 参考代码:
    • 输出:
    • 结尾:

题目描述: Python|【网易2019年秋招笔试题】编程题第二题(香槟塔里倒香槟——参考代码和编程思路)
文章图片

Python|【网易2019年秋招笔试题】编程题第二题(香槟塔里倒香槟——参考代码和编程思路)
文章图片

Python|【网易2019年秋招笔试题】编程题第二题(香槟塔里倒香槟——参考代码和编程思路)
文章图片

题目描述: 节日到啦,牛牛和妞妞邀请了好多客人来家里做客。 他们摆出了一座高高的香槟塔,牛牛负责听妞妞指挥,往香槟塔里倒香槟。 香槟塔有个很优雅的视觉效果就是如果这一层的香槟满了,就会从边缘处往下一层流去。 妞妞会发出两种指令,指令一是往第x层塔内倒体积为v的香槟,指令二是询问第k层塔香摈的体积为多少。 告诉你香槟塔每层香槟塔的初始容量,你能帮牛牛快速回答妞妞的询问吗? 输入描述: 第一行 为两个整数n,m。表示香槟塔的总层数和指令条数。 第二行为n个整数ai,表示每层香槟塔的初始容量。 第三行到第2+m行有两种输入,一种输入是“2 x v" 表示往第x层倒入体积为v的香槟; 另一种输入是“1 k” 表示询问第k层当前有多少香槟。 1 <=n,m<=1000。 1 <= n,m<= 200000,1 <= ai ,v <= 10000000000 输出描述: 对于每个询问,输出一个整数,表示第x层香槟的容量。

参考案例:
参考案例1: 1 2 8 2 1 9 1 1 参考案例2: 5 4 1 2 2 10 1 1 3 2 2 5 2 4 3 1 4

思路分析:
思路分析: 1、先想办法读取输入数据,然后转换格式 2、看到案例1,可以画一个示意图: 第1层 容量:8 两个指令: 1、在第一层加9 2、第一层满了,溢出去了1 3、输出第一层的容量:8 3、案例2: 第一层 容量:1 第二层 容量:2 第三层 容量:2 第四层 容量:10 第五层 容量:1 四个指令: 1、查询第3层 输入为0(这里可以知道,刚开始里面都是为空瓶子) 2、第二层加5,第二层满了 为2 ,第三层满了 为2,第四层为1 3、第四层加3,第四层为 4 4、查询第四层,输出为 4

编程思路:
编程思路: 1、读取输入,并创建两个列表,一个是最大容量列表(读取拿到),一个是当前容量列表(设为0) 2、格式转换 3、for循环m个指令: 1、如果指令列表的元组第一个值是1,传入层数,调用指令1函数: 1、直接打印当前容量列表的对应值 2、如果指令列表的元组第一个值是2,传入层数x和体积v,调用指令2函数: 1、创建变量c为,剩余添加体积,初始值为v. 2、尝试while循环(c不为零): 1、如果(当前层数容量 + c)>最大容量: 1、c = c - (最大容量-当前容量) 2、当前层容量 = 当前层最大容量 2、如果(当前层容量 + c)<= 当前层最大容量: 1、当前层容量 += c 2、c = 0 3、如果c还没有等于0,将层数自增1 4、如果层数已经超过了n,说明已经溢出去了,结束~

参考代码:
python2.7编译器 删掉了很多print语句

first = raw_input() print "first:",first n,m = first.split(' ') n = int(n) m = int(m)r_list = raw_input().split(' ')tem = [] try: for r in r_list: tem.append(int(r)) except: tem.append(int(r_list)) r_list = temdef order1(k): print x_list[k-1]def order2(x,v): c = v try: while(c>0 and x <= n): if(x_list[x-1]+v<=r_list[x-1]): x_list[x-1] += v c = 0 else: c = c - (r_list[x-1]-x_list[x-1]) x_list[x-1] = r_list[x-1] x += 1 except: c = 0 print "可能最后一层都满了"order = [] for i in range(m): order.append(raw_input().split(" "))x_list = [0]*len(r_list)for o in order: if(int(o[0])==1): order1(int(o[1])) elif(int(o[0])==2): order2(int(o[1]),int(o[2])) else: print "输错了~"

输出:
5 4 first: 5 41 2 2 10 1 n: 5 m: 4 ['1', '2', '2', '10', '1']1 32 2 52 4 31 3 命令1的输出 0 命令1的输出 2

【Python|【网易2019年秋招笔试题】编程题第二题(香槟塔里倒香槟——参考代码和编程思路)】Python|【网易2019年秋招笔试题】编程题第二题(香槟塔里倒香槟——参考代码和编程思路)
文章图片

结尾: 自己只是简单地测试了一下两个案例,并没有提交到系统,并不知道会不会对所有的输入有效。
如果有大佬发现其中有错误,欢迎批评指教~

    推荐阅读