阿里校招暑假实习4.20笔试第一题

我是个臭弟弟,只做了第一题还没有全过。。。
第一次写CSDN,给后来人留点东西。。。
言归正传。

第一题

题目:
勇士打怪

假设勇士能力值为a
每个怪兽也有能力b
如果勇士的能力值大于等于怪兽得能力值,则勇士可以消灭怪兽获得1金币
勇士随时可以花费1金币使自己的能力值提高1

输入如下:
a,n
A[i]

1 3
1 2 2

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

对以上输入,输出为2,代表勇士能获得的最大金币数为2。

下面是我自己对该问题的 提交代码,但是通过率为90%还不知道哪里出了问题。

//不常用标准输入输出感觉有点蠢。。。

整体思路如下:

勇士当前能力值能获得的最大金钱
也就是找到勇士能获得的最大能力值
循环为能力值从初始值到最大能力值
找到每个能力值下能获得的最大金钱:
		使用bisect包中的bisect_right(),对所有怪兽能力排序后
		可直接获取该能力下能获得的最大金钱
		再减去升到该能力值的花费即可
最终输出每个能力值下能获得的最大金钱的最大值

最后90%通过没想到哪里出了问题。。大佬们请指教
// An highlighted block
import sys
import bisect
if __name__ == "__main__":
    # 读取第一行的a,n
    line0 = sys.stdin.readline().strip()
    aa = list(map(int,line0.split()))
    a=int(aa[0])
    n=int(aa[1])
    line1 = sys.stdin.readline().strip()
    A = list(map(int, line1.split()))
    A_sorted = sorted(A)
    m_can = bisect.bisect_right(A_sorted,a)
    #print(A_sorted)
    #print(m_can)
    if m_can == 0 or a == 0:
        print(m_can)
    value_max = []
    value_max.append(m_can)
    iaa = 0
    for i_a in range(a,m_can+a):
        i_a = i_a + 1 
        iaa = iaa + 1
        m_new = bisect.bisect_right(A_sorted,i_a)
        #print(m_new)
        m_new = m_new-iaa
        value_max.append(m_new)
    print(max(value_max))

在大佬岐哥帮助下,找到了一个反例:
a = 1
A = [1,1,3,4,4,4,4,4,4,4,4,4]
程序中没有正确找到能力值最大可以达到多少,更新后的代码如下:

// An highlighted block
import sys
import bisect
if __name__ == "__main__":
    # 读取第一行的a,n
    line0 = sys.stdin.readline().strip()
    aa = list(map(int,line0.split()))
    a=int(aa[0])
    n=int(aa[1])
    line1 = sys.stdin.readline().strip()
    A = list(map(int, line1.split()))
    A_sorted = sorted(A)
    m_can = bisect.bisect_right(A_sorted,a)
    #print(A_sorted)
    #print(m_can)
    if m_can == 0 or a == 0:
        print(m_can)
    value_max = []
    value_max.append(m_can)
    iaa = 0
    for i_a in range(a,m_can+max(value_max)): //循环终止条件应为能达到的最大能力值,即加上最大金钱
        i_a = i_a + 1 
        iaa = iaa + 1
        m_new = bisect.bisect_right(A_sorted,i_a)
        #print(m_new)
        m_new = m_new-iaa
        value_max.append(m_new)
    print(max(value_max))

你可能感兴趣的:(阿里校招暑假实习4.20笔试第一题)