欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

阿里校招暑假实习4.20笔试第一题:勇士打怪

程序员文章站 2024-03-19 22:53:04
...

题目:勇士打怪

假设勇士能力值为a

每个怪兽也有能力b

如果勇士的能力值大于等于怪兽得能力值,则勇士可以消灭怪兽获得1金币

勇士随时可以花费1金币使自己的能力值提高1

输入如下:

a,n

A[i]

1 3

1 2 2

含义:勇士能力值a为1,有3个怪兽,每个怪兽的能力存在A[i]中,求勇士能获得的最大金币数,怪兽可以不打完。

我在CSDN里边浏览了一小会儿就看到了这个题目,以下是原文出处:https://blog.csdn.net/y125231776/article/details/105643381

看到这篇文章后我就自己来捣鼓捣鼓:

这是他的思路:

勇士当前能力值能获得的最大金钱

也就是找到勇士能获得的最大能力值

循环为能力值从初始值到最大能力值

找到每个能力值下能获得的最大金钱:

使用bisect包中的bisect_right(),对所有怪兽能力排序后

可直接获取该能力下能获得的最大金钱

再减去升到该能力值的花费即可

最终输出每个能力值下能获得的最大金钱的最大值

然后我的思路:

将怪物能力值进行排序,勇士永远只打最辣鸡的怪

创建一个元组warrior用来保存目前有的金钱及对应的能力值

每当勇士打完这个能力值所能打的怪后,比较目前金钱是否是历史最多,是的话就取代warrior,否就继续

若金钱不够升级来打下一级的怪物,或走完全程,则勇士回家领便当^_^

最终输出初始能力金钱、怪物的能力、金钱最多值和对应的能力值,以及最后拥有的金钱和对应的能力值

代码如下:

import random
monster=[]#怪物能力值
for i in range(40):
    monster.append(random.randint(1,100))
for i in range(30):
    monster.append(random.randint(1,75))
for i in range(20):
    monster.append(random.randint(1,50))
for i in range(10):
    monster.append(random.randint(1,25))
monster.sort()
#以上是我自己模拟的怪物能力值,这部分题目回给出,以下才是正题
if __name__ == "__main__":
    a=5#勇士能力值
    money=0#勇士的金币
    warrior=money,a
    print('勇士初始的金币和能力值:', warrior)
    for b in monster:
        if a>=b:
            money+=1
        else:
            if money>warrior[0]:
                warrior=money,a
            if a+money<b:
                break
            else:
                money-=b-a-1
                a=b
    print('怪物的能力值:',end='')
    for i in range(100):
        if i%25==0:
            print()
        print(monster[i],end='\t')
    print()
    print('最高金币时对应的能力值:',warrior)
    print('最终拥有的金币及能力值:',(money,a))