余博文


私信TA

用户名:dotcpp0595286

访问量:1506

签 名:

小余也有未来!!

等  级
排  名 1844
经  验 2618
参赛次数 0
文章发表 20
年  龄 0
在职情况 学生
学  校 长江大学
专  业

  自我简介:

TA的其他文章

解题思路:  n个时段n个游戏,每个时段只能玩一个游戏,所以只需要给玩的游戏排个次序使总罚款最小。贪心点:按时段依次选择ddl(截止时间)最前的先玩,不着急的后玩,如果ddl相同则wi罚款多的先玩罚款少的后玩;如果该游戏已经过了ddl那肯定是要罚款的,但我们可以在done(已经完成且没有罚款的游戏的wi值
)找一下,看看能不能极限一换一找个最小的罚款;已经罚款的游戏可以直接舍弃排在最后玩,相当于不占用当前时段

注意事项:

参考代码:

Money = int(input())
N = int(input())
ddl = [int(i) for i in input().split()]
wi = [int(i) for i in input().split()]
list = [(ddl[i],wi[i]) for i in range(N)]
list = sorted(list, key = lambda t:(t[0],-t[1]))

done = []   # 已经完成且没有罚款的游戏的wi值
i = 0       # i指时段
while 1:    
    i += 1
    if len(list) == 0:
        break
    if list[0][0] >= i:   # 未超时,不用罚款
        done.append(list[0][1])
        list.pop(0)
    else:                # 已超时,要罚款
        if list[0][1] > min(done):
            done.append(list[0][1])
            list.pop(0)
            Money -= min(done)
            done.remove(min(done))
        else:
            Money -= list[0][1]
            list.pop(0)
            i -= 1        #  已经罚款的游戏可以直接舍弃排在最后玩,相当于不占用当前时段

print(Money if Money>0 else 0)


 

0.0分

1 人评分

新上线《蓝桥杯辅导》课程,近五年的蓝桥杯省赛与国赛真题都有,从读题开始理解题意、梳理思路、实现代码再提交评测全过程,可有效提升获奖比例甚至进国赛!课程介绍、试听请猛击这里

  评论区

  • «
  • »