题解 | #拦截导弹#

拦截导弹

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))

全部评论

相关推荐

05-12 11:09
已编辑
门头沟学院 后端
已注销:没必要放这么多专业技能的描述。这些应该是默认已会的,写这么多行感觉在凑内容。项目这块感觉再包装包装吧,换个名字,虽然大家的项目基本都是网上套壳的,但是你这也太明显了。放一个业务项目,再放一个技术项目。技术项目,例如中间件的一些扩展和尝试。
点赞 评论 收藏
分享
求面试求offer啊啊啊啊:1600一个月?
点赞 评论 收藏
分享
好久没来牛客了,今天面试了一个实习生,感觉对方形象乱糟糟的,头发像鸡窝,像刚睡醒就来面试了,第一印象直接大打折扣,感觉我没有受到应有的尊重,再加上对方业务能力也一般,我直接挂掉;大家面试的时候还是好好收拾一下自己吧,争取给面试官留下个好印象,面试这东西还是存在眼缘的
MinJerous:更在乎本质,应该看候选人是否和岗位需要的能力匹配。洗脸/不洗头都无所谓吧,说不定人家刚刚通宵准备,就是为了这场面试呢?你挂掉他核心原因还是他能力不行,而不是形象。就算形象好点,能力不行你敢给过吗,不怕后面+1质疑你
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务