题目描述
小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,
他的角色的初始能力值为 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键程序自动执行,是吧
但是如果说我们想让输入什么时候停止,程序就在什么时候执行,这个时候就需要设置一个循环,当你的输入为空,程序就知道了,你要执行程序了。
举个例子:
运行示例:
1
1
2
2
3
3
Process finished with exit code 0
好了。说完了自己关于这道题目的一个小问题和解决了之后,接下来看代码,关于这道题的解答:python实现
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!收工!
小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,
他的角色的初始能力值为 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!收工!