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

版权声明:转载请标注来源 https://blog.csdn.net/hehedadaq/article/details/82532288

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

题目描述:

这里写图片描述
这里写图片描述
这里写图片描述

题目描述:
  节日到啦,牛牛和妞妞邀请了好多客人来家里做客。
  他们摆出了一座高高的香槟塔,牛牛负责听妞妞指挥,往香槟塔里倒香槟。
  香槟塔有个很优雅的视觉效果就是如果这一层的香槟满了,就会从边缘处往下一层流去。
  妞妞会发出两种指令,指令一是往第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、格式转换
  3for循环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 = tem

def 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 4

1 2 2 10 1
<type 'list'>
n: 5
m: 4
['1', '2', '2', '10', '1']

1 3

2 2 5

2 4 3

1 3
命令1的输出
0
命令1的输出
2

这里写图片描述

结尾:

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

猜你喜欢

转载自blog.csdn.net/hehedadaq/article/details/82532288
今日推荐