#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。

【解题思路】

本题考察贪心算法问题。

  1. 输入总分段数total_segements、结束时间s_limits和奖励值s_rewards,将结束

时间和奖励值遍历存入到limits和rewards。然后根据这些信息构建一个game列

表,每个列表项为[结束时间,奖励值,是否可选,是否选过]。

  1. 定义函数check_chooseable(),check_chooseable()函数用于检查当前状态下是否

可以选择某个游戏。

3.定义函数get_current_max(),get_current_max()函数用于获取当前状态下可以

选择的最大奖励。

4.从total_segements开始循环遍历所有可能的分段数,计算最大奖励

Limitation

1s, 1024KiB for each test case.