2020 百度实习春招编程第一题

题目

首先给出n个数字a1,a2,….an,然后给你m个回合,每回合你可以从中选择一个数取走它,剩下来的每个数字ai都要减去一个值bi。如此重复m个回合,所有你拿走的数字之和就是你所得到的分数。
现在给定你a序列和b序列,请你求出最多可以得到多少分

输入

输入第一行,仅包含一个整数n(1100),表示数字的个数。
第二行,一个整数m(1),表示回合数。
接下来一行有n个不超过10000的正整数,分别为a1,a2…an. 最后一行有n个不超过500的正整数,分别为b1,b2….bn.

输出

输出仅包含一个正整数,即最多可以得到的分数
样例输入
5
5
10 20 30 40 50
4 5 6 7 8
样例输出
100

我的思路

求an的最大值,每次取最大,保证m次以后取的总和最大,每次取完之后ai-bi,循环进行。(是错的,对唔住,别看了,,,)

代码

我的代码:

n = int(input("n:"))
m = int(input("m:"))
an = input("an")
an = an.split(" ")
an = list(map(int, an))
# print(an)
bn = input("bn")
bn = bn.split(" ")
bn = list(map(int, bn))
sum = 0
while 1:
    sum += (max(an))
    an.remove((max(an)))
    m -= 1
    for j in range(m):
        an[j] = an[j]-bn[j]
    # print(an)
    if m == 0:
        print(sum)
        break
        # return sum
#百度实习春招笔试##百度##笔试题目#
全部评论
首先考虑n等于m的情况,这时候每个数字都会选,则进项确定,不确定的是代价(被减去的值),这时候策略是比较简单的,代价(bi)越大的值越先选……。然后考虑n=m+1时候的情况,这个问题相比前一个问题就是要剔除一个值了,这时候可以看成一个递增的问题,即先处理m个,再考虑最后一个。这时候先把前m个值按照bi排序,再计算第m+1个元素取代第i个元素的增益,如果最大增益能大于0,则取代并更新备用的数组,否则备用数组不动(这部分就算按照一定策略,时间复杂度o(n)),备用数组就是我们选择的m个数,按照第一个问题的策略,能得出此时的结果。最后,考虑n>m+1,这时候能不能分解成一系列n=m+1的子问题???如果能分解的话,就按照前一步的步骤就可以计算了
点赞 回复 分享
发布于 2020-03-29 23:45
每次取bn最大的值,使减去的总值可以最小,可行吗?
点赞 回复 分享
发布于 2020-03-29 22:41
贪心只能过27%。这个不是全局最优的解
点赞 回复 分享
发布于 2020-03-29 21:40
这个代码跑过了吗?
点赞 回复 分享
发布于 2020-03-29 21:38

相关推荐

点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

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