网易招聘笔试(升级之路)

题目描述

小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,
他的角色的初始能力值为 a.在接下来的一段时间内,
他将会依次遇见n个怪物,每个怪物的防御力为b1,b2,b3…bn.
如果遇到的怪物防御力bi小于等于小易的当前能力值c,那么他就能轻松打败怪物,
并且使得自己的能力值增加bi;如果bi大于c,那他也能打败怪物,但他的能力值只能增加bi 与c的最大公约数.
那么问题来了,在一系列的锻炼后,小易的最终能力值为多少?

输入描述:


对于每组数据,第一行是两个整数n(1≤n<100000)表示怪物的数量和a表示小易的初始能力值.
第二行n个整数,b1,b2…bn(1≤bi≤n)表示每个怪物的防御力

输出描述:

对于每组数据,输出一行。每行仅包含一个整数,表示小易的最终能力值

输入例子:


3 50
50 105 200
5 20
30 20 15 40 100


输出例子:

110
205

分析:
这个问题其实比较简单,算法中用到了最大公约数,思路就是分别处理每次输入的循环条件下的结果就好了
可是为什么昨天没有想出来呢?那是因为我没有弄明白输入和输出在enter键的处理关系。
当我们想着是没有输入也就意味着执行程序,按下enter键程序自动执行,是吧
但是如果说我们想让输入什么时候停止,程序就在什么时候执行,这个时候就需要设置一个循环,当你的输入为空,程序就知道了,你要执行程序了。
举个例子:
while True:
    s = raw_input()
    if s == '':
        break
    print s
上面这个程序就是说,当你没有输入了,即输入为空时,跳出持续输入循环,执行程序
运行示例:
1
1
2
2
3
3


Process finished with exit code 0


好了。说完了自己关于这道题目的一个小问题和解决了之后,接下来看代码,关于这道题的解答:python实现
#-*-coding:UTF-8-*-
def CalLevel(ObjList,n):#计算升级之后的级数
    for i in range(len(ObjList)):
        if n >= ObjList[i]:
            n += ObjList[i]
        #如果n大于这个数,那么就直接加上这个数
        else:
            n += gcd(n,ObjList[i])
        #如果n小于这个数,就加上这个数和n的最大公约数
    return n
def gcd(x, y):
    #return x if y == 0 else gcd(y, x%y)
    if x <= y:
        x,y = y,x
    if y == 0:
        return x
    #注意在最大公约数辗转相除法的程序中一定要加上这一句!
    #判断分母是不是为0,如果是0,按照规定,0和这个数的最大公约数
    #是这个数本身
    else:
        return gcd(y,x%y)
        #递归调用
a = []#a是把计算好的每一组“升级”后的级数存放在它里面
while True:
    s = raw_input()
    #if s.startswith(' '):
        #break
    if s == '':
        break
    #这一句阻挠了我一天才想明白,假若要不留输入中断痕迹的话
    #那就是当输入的字符串是空格呀!怪我想得太多咯!
    else:
        n, p = map(int, s.split())
        #在输入非空的时候
        # 我们就可以读入数据了
        t = map(int,raw_input().split())
        #print t
        #t是在输入怪物数和初始级数时,要分别输入的怪物经验值
        a.append(CalLevel(t,p))
        #然后把计算好的放在a中等待最后的输出。
    #我们注意,每次循环输入的数都有可能不相等,属于重新输入的
    #所以不需要来处理之前的输入数据
for i in range(len(a)):
    print a[i]
    #把a中的元素输出来,也就是每一次打完怪物的级数
运行结果:

E:\Python27\python.exe D:/python/python算法/LevelUp.py
3 50
50 105 200
5 20
30 20 15 40 100

110
205

Process finished with exit code 0

OK!收工!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值