找回密码
 立即注册
查看: 2|回复: 0

GESP五级题巧夺大奖解题报告:贪心算法优化与代码实现(洛谷B3872)

[复制链接]
  • 打卡等级:即来则安
  • 打卡总天数:21
  • 打卡月天数:9
  • 打卡总奖励:137
  • 最近打卡:2025-07-13 16:05:00

24

主题

0

回帖

4500

积分

VIP会员

积分
4500
发表于 昨天 16:07 | 显示全部楼层 |阅读模式
一、题目解读
2023年GESP五级题目“巧夺大奖”(洛谷B3872)是一个经典的资源分配问题。题目要求玩家在有限时间内选择多个游戏,每个游戏有截止时间和奖励值,需在截止时间前完成游戏以获得奖励。目标是通过策略选择,**化总奖励。问题关键在于如何在时间冲突的情况下合理分配任务,属于典型的贪心算法应用场景。
二、解题思路
采用贪心策略:优先选择奖励高的游戏,并为其分配最早可用的时间段。核心思想是“优先满足高价值任务”,通过以下步骤实现:
1. 奖励降序排序:按游戏奖励从高到低排序,确保优先处理高收益任务。
2. 逆序查找可用时段:从每个游戏的截止时间逆向遍历时间段,找到**个未被占用的槽位并标记,避免时间冲突。
该策略保证在有限时间内优先选择高奖励任务,降低因低奖励任务占用资源导致总收益下降的风险。
三、解题步骤
1. 输入数据:读取游戏数量n,依次输入各游戏的截止时间和奖励值。
2. 数据预处理:对游戏数组按奖励降序排序。
3. 分配时间段:
    遍历每个游戏,从截止时间开始逆向遍历时间段(1到min(n, deadline))。
    若找到未被占用的时段(slot[j]为false),标记该时段并累加奖励,跳出循环。
4. 输出结果:最终累加的奖励总值即为**解。
四、代码与注释
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;

  5. struct Game {
  6.     int deadline; // 截止时间
  7.     int reward;   // 奖励值
  8. };

  9. // 按奖励降序排序的比较函数
  10. bool compareReward(const Game& a, const Game& b) {
  11.     return a.reward > b.reward;
  12. }

  13. int main() {
  14.     int n;   // 游戏数量
  15.     cin >> n;
  16.    
  17.     vector<Game> games(n); // 存储游戏信息
  18.     for (int i = 0; i < n; ++i) {
  19.         cin >> games[i].deadline;
  20.     }
  21.     for (int i = 0; i < n; ++i) {
  22.         cin >> games[i].reward;
  23.     }
  24.    
  25.     // 贪心核心:按奖励降序排序
  26.     sort(games.begin(), games.end(), compareReward);
  27.    
  28.     vector<bool> slot(n + 1, false); // 时间段占用标记(1~n)
  29.     int total = 0;                   // 总奖励
  30.    
  31.     // 分配时间段
  32.     for (int i = 0; i < n; ++i) {
  33.         for (int j = min(n, games[i].deadline); j >= 1; --j) {
  34.             if (!slot[j]) {          // 找到可用时段
  35.                 slot[j] = true;
  36.                 total += games[i].reward;
  37.                 break;              // 当前游戏分配完毕
  38.             }
  39.         }
  40.     }
  41.    
  42.     cout << total << endl;
  43.     return 0;
  44. }
复制代码

五、总结
该解法通过贪心算法实现高效求解,时间复杂度为O(nlogn)(排序)+ O(n²)(分配),但实际由于逆序查找的优化,常表现出接近线性效率。关键在于“高奖励优先”的排序和“逆向查找空位”的分配逻辑,避免了复杂的动态规划,适用于大规模数据场景。需注意边界处理(如min(n, deadline)避免越界)。此策略为同类资源分配问题提供了经典范式,值得深入理解。
来源:信奥之路

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表