SoulisProgrammer 2023-11-13 22:15 采纳率: 54.5%
浏览 14
已结题

PTA | 7-32 植物大战僵尸(简单版)

导入

img

输入格式:

第一行给出五个正整数,依次为 N ,M ,L,K ,V

N 表示豌豆射手每发豌豆的威力 (豌豆飞行过程耗时忽略不计) ,[1,20]
M 表示戴夫手拿平底锅,一击爆头的威力,[1,100]
L 表示僵尸一开始的里戴夫家门口的距离 ,[10^3,10^7]
K 为僵尸的初始血量 ,[100,10^7]
V 为僵尸每秒钟前进的距离,[1,500]

N M L K V

输出格式:

如果僵尸被击倒,则输出僵尸被击倒时的x坐标
反之输出oh~NO!+僵尸剩余血量

输入样例1:

2 10 1000 800 1

输出样例1:

200

输入样例2:

1 10 1000 800 1

输出样例2:

......oh~NO!340

我的实现代码

python3

N, M, L, K, V = list(map(int, input().split(' ')))
time = (L - 100) / V
hit = N * (time // 2)
if hit >= K:
    x = int(L - V * (K / N * 2))
    print(x)
else:
    if hit + M >= K:
        print(0)
    else:
        blood = int(K - (M + N * (time // 2)))
        print(f'......oh~NO!{blood}')

问题

img

会有一个测试点过不去,请教一下是怎么回事

  • 写回答

4条回答 默认 最新

  • 梦幻精灵_cq 2023-11-15 22:52
    关注
    • 您的通关代码,也是模拟的戴夫和豌豆炮与僵尸的对抗过程哦😊,我已全部注释“可疑”行。
      我依旧纠结,僵尸半路被干倒的话,为什么倒下后还得移动一秒,结果才能达“题目预期输出”

      img

    我注释了您的通关代码

    
    #from math import floor
    #N, M, L, K, V = list(map(int, input().split(' ')))
    N, M, L, K, V = 15, 10, 1000, 100, 5 # 您的代码与题目样例要求一致,返回940,我终究认为是935。
    N, M, L, K, V = 2, 10, 1000, 800, 1 # 您的代码与题目样例要求一致,返回200,我终究认为是201。
    time = (L - 100) / V
    #hit = N * floor(time / 2) # 这样子操作和之前的int函数没有差别的,能通过的关键点不在这里。
    hit = N * (time // 2) # “//”这也是地板除运算符,相当于floor。
    if hit >= K: # 僵尸可能承受的全部攻击超过其血量。
        #n = 1 # 初值应是可以攻击的2。
        n = 2 # 豌豆弹攻击标识初值,可以攻击。
        #k = K # 此变量可以不用设置,直接用K。因为这分支完成执行后程序也结束了,不存在污染变量K的问题。
        while L >= 0: # 循环模拟豌豆、僵尸对抗。
            L -= V # 僵尸移动。
            #n += 1 # 我认为冷却计时应放在攻击之后。
            if n == 2: # 豌豆炮冷却完成,可以攻击。
                n = 0 # 攻击后重置冷却计时。
                K -= N # 僵尸因豌豆弹攻击而失血。
            n += 1 # 豌豆炮冷却计时。
            
            if K <= 0: # 干倒僵尸。
                L -= V # 我纠结的就是这里,僵尸已倒,怎么还要移动一步?
                print(L)
                break
    else:
        if hit + M >= K:
            print(0)
        else:
            #blood = K - (M + N * floor(time / 2))
            #print(f'......oh~NO!{blood}')
            print(f'......oh~NO!{K - (M + hit)}') # 可以利用前面已计算出来的变量,应该节约点时间。
    
    

    代码已完成调试,运行正常。


    • N, M, L, K, V = 15, 10, 1000, 100, 5
      对于这组输入,您的代码输出

      img


      显然不是预期。第7次攻击打倒了僵尸,1000 - 5×7(有豌豆弹攻击) - 5×6(无攻击) = 935,应该输出935才对。

    您的代码

    
    #N, M, L, K, V = list(map(int, input().split(' ')))
    N, M, L, K, V = 15, 10, 1000, 100, 5
    time = (L - 100) / V # 僵尸可以移动的最大次数。
    hit = N * (time // 2) # 僵尸承受的最大攻击。
    if hit >= K: # 打倒僵尸。
        x = int(L - V * (K / N * 2))
        print(x)
    else:
        if hit + M >= K: # 僵尸被平底锅爆头而亡。
            print(0)
        else: # 僵尸被平底锅爆头而不倒。
            print(f'......oh~NO!{K-(hit+M)}') # 这一行用了前面您前边求出的变量。
    
    

    我用模拟游戏对战的循环写成的代码,题目给出的第一样例,我得到了201,正纠结于是我不对,还是样例有错😣😣

    样例N, M, L, K, V = 15, 10, 1000, 100, 5
    输出

    img

    您也帮我瞅瞅,错在哪儿了我。

    
    '''
    
    N    豌豆弹威力(间隔2s攻击一次)
    M    戴夫平底锅爆头威力
    L    僵尸初始位置
    K    僵尸初始血量
    V    僵尸速度 cm/s
    
    '''
    #N, M, L, K, V = map(int, input('\n输入:\n ').strip().split())
    N, M, L, K, V = 2, 10, 1000, 800, 1
    #N, M, L, K, V = 1, 10, 1000, 800, 1
    N, M, L, K, V = 15, 10, 1000, 100, 5
    
    kill = 2 # 豌豆射手攻击标识。
    while L > 0:
        print(N, M, L, K, V)
        L -= V # 僵尸前进。
    
        if kill == 2 and L > 100:
            K -= N # 炮击僵尸。
            kill = 0 # 重置攻击标识。
    
            if K <= 0: # 僵尸被击倒,输出僵尸当前位置并退出程序。
                print('\n输出:\n', L)
                exit() 
    
        kill += 1 # 炮击间隔计数。
    
        if L <= 0: # 如果僵尸到达戴夫门前,据其血量打印相应提示信息后退出程序。
            K -= M # 戴夫平底锅爆头僵尸。
            tip = L if K <=0 else f"oh~NO! {K}"
            tip = 0 if K <=0 else f"oh~NO! {K}" # 也可以直接写0位置。
            print('\n输出:\n', tip)
            exit()
    

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 11月24日
  • 已采纳回答 11月16日
  • 创建了问题 11月13日

悬赏问题

  • ¥15 台达变频器MS300与伺服驱动器B3系列的抱闸与电路设计如何实现
  • ¥20 C++通过HICON获取argb像素数组
  • ¥15 如何利用支持向量机提高分类器正确率和筛选理想分类器
  • ¥15 Pygame坦克大战游戏开发实验报告
  • ¥15 用vmmare虚拟机用sentaurus仿真的时候,调用terminal程序,输入swb指令弹出这个,打不开workbench,桌面上面的sentaurus workbench也打不开
  • ¥75 使用winspool.drv的SetPrinter设置打印机失败
  • ¥15 simulink 硬件在环路仿真
  • ¥15 python动态规划:N根火柴摆出的最大数字
  • ¥20 (标签-excel)
  • ¥200 求idea10和MyEclipse7.1