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

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

2个月前 (06-27)

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

一、题目解读

2023年GESP五级题目“巧夺大奖”(洛谷B3872)是一个经典的资源分配问题。题目要求玩家在有限时间内选择多个游戏,每个游戏有截止时间和奖励值,需在截止时间前完成游戏以获得奖励。目标是通过策略选择,最大化总奖励。问题关键在于如何在时间冲突的情况下合理分配任务,属于典型的贪心算法应用场景。

二、解题思路

采用贪心策略:优先选择奖励高的游戏,并为其分配最早可用的时间段。核心思想是“优先满足高价值任务”,通过以下步骤实现:

1. 奖励降序排序:按游戏奖励从高到低排序,确保优先处理高收益任务。

2. 逆序查找可用时段:从每个游戏的截止时间逆向遍历时间段,找到第一个未被占用的槽位并标记,避免时间冲突。

该策略保证在有限时间内优先选择高奖励任务,降低因低奖励任务占用资源导致总收益下降的风险。

三、解题步骤

1. 输入数据:读取游戏数量n,依次输入各游戏的截止时间和奖励值。

2. 数据预处理:对游戏数组按奖励降序排序。

3. 分配时间段:

    遍历每个游戏,从截止时间开始逆向遍历时间段(1到min(n, deadline))。

    若找到未被占用的时段(slot[j]为false),标记该时段并累加奖励,跳出循环。

4. 输出结果:最终累加的奖励总值即为最优解。

四、代码与注释

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct Game {
    int deadline; // 截止时间
    int reward;   // 奖励值
};

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

int main() {
    int n;   // 游戏数量
    cin >> n;
    
    vector<Game> games(n); // 存储游戏信息
    for (int i = 0; i < n; ++i) {
        cin >> games[i].deadline;
    }
    for (int i = 0; i < n; ++i) {
        cin >> games[i].reward;
    }
    
    // 贪心核心:按奖励降序排序
    sort(games.begin(), games.end(), compareReward);
    
    vector<bool> slot(n + 1, false); // 时间段占用标记(1~n)
    int total = 0;                   // 总奖励
    
    // 分配时间段
    for (int i = 0; i < n; ++i) {
        for (int j = min(n, games[i].deadline); j >= 1; --j) {
            if (!slot[j]) {          // 找到可用时段
                slot[j] = true;
                total += games[i].reward;
                break;              // 当前游戏分配完毕
            }
        }
    }
    
    cout << total << endl;
    return 0;
}

五、总结

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

原创内容 转载请注明出处

分享给朋友:

相关文章

2023年GESP五级题「因式分解」洛谷B3871算法解析与代码实现

2023年GESP五级题「因式分解」洛谷B3871算法解析与代码实现

一、题目解读2023年GESP五级题「因式分解」(洛谷B3871)要求将给定的大整数N分解为质因数的乘积形式,并输出每个质因数及其指数。题目考察核心算法为质因数分解,需高效处理大数分解,避免超时。难点...

【牛客13256题解析】贪心算法优化题目组合问题:三元组与二元组的解题思路

【牛客13256题解析】贪心算法优化题目组合问题:三元组与二元组的解题思路

一、题目解读牛客13256题要求处理一组题目难度数据,通过组合三元组(难度差≤20)或二元组(难度差≤10)来重新编排题目,计算需要补充的最小题目数量。题目本质是资源分配与优化问题,需高效组合现有题目...

洛谷P12597题解:子序列查找的贪心与二分优化详解

洛谷P12597题解:子序列查找的贪心与二分优化详解

一、题目解读洛谷P12597题目要求在一个字符串s中寻找最长的子序列,该子序列需满足字符顺序与另一个字符串t相同。题目强调子序列无需连续,但字符相对位置需保持一致。例如,若t为"abc&qu...

力扣LCR074题区间合并算法解析:贪心排序与区间重叠处理

力扣LCR074题区间合并算法解析:贪心排序与区间重叠处理

一、题目解读力扣LCR074题要求对给定的二维区间数组(每个区间由起始点和终止点构成)进行合并,将重叠的区间合并为更宽的区间,最终输出不重叠的合并结果。例如,输入[[1,3],[2,6],[8,10]...

力扣1643题:第K小字典序路径(附C++代码与解题思路)

力扣1643题:第K小字典序路径(附C++代码与解题思路)

一、题目解读本题要求生成从原点(0, 0)到目标坐标(destination[0], destination[1])的路径中,字典序第K小的路径。路径仅由向下字符'V'(代表垂直移动)...

NOIP 2013提高组积木大赛(洛谷P1969)题解:贪心算法优化与代码解析

NOIP 2013提高组积木大赛(洛谷P1969)题解:贪心算法优化与代码解析

一、题目解读2013年NOIP提高组“积木大赛”(洛谷P1969)要求处理积木堆叠问题。题目给定n个积木高度,需计算按特定规则堆叠后的总高度差。核心在于识别上升序列的累积增量,而非简单求和。二、解题思...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。