题解 | #拦截导弹#

拦截导弹

http://www.nowcoder.com/questionTerminal/218f3db1f66d465bbf9578625aa90785

该题两问分开做的,第一个用了动规,max_num数组下标为i的元素表示第i个导弹是某个系统的第max_num[i]发炮弹,如果前i发炮弹中某个第j发炮弹的最低高度并且比当前炮弹高,那么第i发炮弹就在第j发炮弹之后进行拦截,即max_num[i]= max_num[j]+1。max_num中的最大值即为所求。 第二问,设置min_num数组表示最少需要len个拦截系统,min_num[i]表示第i个拦截系统的当前最低高度,遍历一遍炮弹的高度,如果有某个拦截系统的当前高度min_num[j]大于炮弹的高度,就让符合条件的拦截系统中最低高度的拦截系统拦截这个导弹,把min_num[i]等于炮弹高度,否则就新建一个拦截系统拦截这个导弹。

num = int(input())
s = input()
nums = s.split(" ")
for i in range(len(nums)):
    nums[i] = int(nums[i])
# print(nums)
max_num = []
ans_max = 0
for i, x in enumerate(nums):
    tmax = 0
    for j in range(0, i):
        if nums[j] >= x and max_num[j] > tmax:
            tmax = max_num[j]
    if ans_max < tmax + 1:
        ans_max = tmax + 1
    max_num.append(tmax + 1)
# print(max_num)
min_num = []


def solve(x: int):
    tmp = -1
    tmpy = 1001
    for i, y in enumerate(min_num):
        if y >= x and y < tmpy:
            tmpy = y
            tmp = i
    if tmp == -1:
        min_num.append(x)
    else:
        min_num[tmp] = x
    return


for x in nums:
    solve(x)
print(ans_max)
print(len(min_num))

全部评论

相关推荐

抱抱碍事梨a:三点建议,第一点是建议再做一个项目,把自我介绍部分顶了,第二点是中南大学加黑加粗,第三点是建议加v详细交流
点赞 评论 收藏
分享
爱吃肉的伊登在写日记:好棒,27届简历能做成这个样子,但是第一个项目感觉cover住难度还是不小的,特别是二面的时候肯定要对分布式系统设计这一块儿有高出正常面试者的水平才行
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务