#4219. 巧夺大奖(23-9C++五级)
巧夺大奖(23-9C++五级)
【问题描述】
小明参加了一个巧夺大奖的游戏节目。主持⼈宣布了游戏规则:
1、游戏分为n个时间段,参加者每个时间段可以选择一个小游戏。
2、游戏中共有n个小游戏可供选择。
3、每个小游戏有规定的时限和奖励。对于第i个小游戏,参加者必须在第T个
时间段结束前完成才能得到奖励R。
小明发现,这些小游戏都很简单,不管选择哪个小游戏,他都能在一个时间段内
完成。关键问题在于,如何安排每个时间段分别选择哪个小游戏,才能使得总奖
励最高?
【输入描述】
输入第一行,包含一个正整数n。n既是游戏时间段的个数,也是小游戏的个数。
约定 。
输入第二行,包含n个正整数。第i个正整数为T,即第i个小游戏的完成期限。
约定 。
输入第三行,包含n个正整数。第i个正整数为R,即第i个小游戏的完成奖励。
约定 。
【输出描述】
输出一行,包含一个正整数C,为最高可获得的奖励。
【样例输入1】
7
4 2 4 3 1 4 6
70 60 50 40 30 20 10
【样例输出1】
230
【样例解释1】
7个时间段可分别安排完成第4、2、3、1、6、7、5个小游戏,其中第4、2、3、
1、7个小游戏在期限内完成。因此,可以获得总计 的奖
励。
【题目大意】
在n个时间段,有n个游戏可以选择,每个游戏有规定的时限和奖励,小游戏都
很简单,不管选择哪个小游戏,都能在一个时间段内完成。如何安排每个时间段
分别选择哪个小游戏,才能总奖励最高。例如,第1个小游戏,完成期限是4,
奖励是7,即第1个小游戏要在第4个游戏结束前完成才可以得到奖励7。
【解题思路】
本题考察贪心算法问题。
- 输入总分段数total_segements、结束时间s_limits和奖励值s_rewards,将结束
时间和奖励值遍历存入到limits和rewards。然后根据这些信息构建一个game列
表,每个列表项为[结束时间,奖励值,是否可选,是否选过]。
- 定义函数check_chooseable(),check_chooseable()函数用于检查当前状态下是否
可以选择某个游戏。
3.定义函数get_current_max(),get_current_max()函数用于获取当前状态下可以
选择的最大奖励。
4.从total_segements开始循环遍历所有可能的分段数,计算最大奖励
Limitation
1s, 1024KiB for each test case.