当前位置:首页 > 牛客 > 【牛客13256题解析】贪心算法优化题目组合问题:三元组与二元组的解题思路

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

2个月前 (06-29)

【牛客13256题解析】贪心算法优化题目组合问题:三元组与二元组的解题思路 贪心算法 动态规划 组合优化 三元组匹配 牛客 第1张

一、题目解读

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

二、解题思路

参考代码采用贪心策略:首先对题目难度排序,随后从低到高遍历,优先匹配三元组(最大效率组合),若无法匹配则尝试二元组,最后处理单独题目。通过分情况讨论,逐步消耗已有题目并统计补充需求,确保全局最优解。

三、解题步骤

1. 输入与预处理:读取n道题目难度并排序,确保后续组合判断的高效性。

2. 遍历与判断:

    若当前位置可组成三元组(diff[i+2]-diff[i]≤20),直接消耗3题;

    若可组成二元组(diff[i+1]-diff[i]≤10),消耗2题并补充1题;

    单独题目则补充2题,消耗1题。

3. 统计结果:累加补充次数,最终输出总需补充量。

四、代码与注释

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

int main() {
    ios::sync_with_stdio(false); // 加快输入输出
    cin.tie(nullptr);
    
    int n;
    cin >> n;                 // 输入题目数量
    vector<int> difficulties(n);
    for(int i = 0; i < n; ++i) {
        cin >> difficulties[i]; // 读取难度数据
    }
    sort(difficulties.begin(), difficulties.end()); // 排序,为后续贪心策略准备

    int res = 0;             // 记录需补充的题目数
    for(int i = 0; i < n; ) { // 遍历时通过i增量控制消耗
        // 检查三元组条件
        if(i + 2 < n && difficulties[i+2] - difficulties[i] <= 20) {
            i += 3;          // 消耗3题,无需补充
        } 
        // 检查二元组条件
        else if(i + 1 < n && difficulties[i+1] - difficulties[i] <= 10) {
            res += 1;        // 需补充1题
            i += 2;          // 消耗2题
        }
        // 单独题目处理
        else {
            res += 2;        // 需补充2题
            i += 1;          // 消耗1题
        }
    }
    cout << res << endl;
    return 0;
}

五、总结

该解法通过排序+贪心策略,将题目组合问题转化为逐层匹配的过程,时间复杂度O(nlogn)(排序)+O(n)(遍历),空间复杂度O(n)。核心在于利用有序数据优先处理高收益组合,降低补充成本。此思路可扩展至类似资源分配场景,具备实用性与算法优化价值。

原创内容 转载请注明出处

分享给朋友:

相关文章

IOI 1994 洛谷1216:如何用O(1)空间解决数字三角形问题?附代码实现

IOI 1994 洛谷1216:如何用O(1)空间解决数字三角形问题?附代码实现

题目重解:数字三角形是一个经典的动态规划问题,给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们需要找到一条路径,使得路径上经过的数字总和最大。这个问题可以很...

LeetCode 120题三角形最小路径和最优解法:动态规划详解与代码实现

LeetCode 120题三角形最小路径和最优解法:动态规划详解与代码实现

一、题目解读LeetCode 120题“三角形最小路径和”要求给定一个由数字组成的三角形,从顶部开始向下移动,每次可向左或向右移动一格,计算从顶至底的最小路径和。三角形以二维向量形式给出,每层元素数量...

洛谷P10472题解:利用栈求解最长有效括号

洛谷P10472题解:利用栈求解最长有效括号

一、题目解读洛谷P10472题要求计算给定字符串中最长有效括号的长度。有效括号指括号成对匹配(如"()[]{}"),子串需连续且内部嵌套正确。题目核心在于判断括号匹配的连续性,并找...

牛客4580题解:动态规划求解网格路径概率问题(C++代码实现)

牛客4580题解:动态规划求解网格路径概率问题(C++代码实现)

一、题目解读牛客4580题要求在一个n×m的网格中计算从起点(1,1)到终点(n,m)的概率。网格中存在障碍物(标记为坏点),路径只能向右或向下移动。到达终点时,若处于边界位置,概率转移规则不同:下边...

【GESP五级真题】挑战怪物(洛谷B4050)题解:质数筛法+动态规划优化,高效攻克魔法攻击策略

【GESP五级真题】挑战怪物(洛谷B4050)题解:质数筛法+动态规划优化,高效攻克魔法攻击策略

一、题目解读2024年GESP五级题“挑战怪物(洛谷B4050)”要求玩家计算击败怪物所需的最小攻击次数。怪物血量H可被分解为魔法攻击(消耗质数血量)与物理攻击(每次固定伤害)的组合。题目难点在于如何...

2018年NOIP货币系统解题报告(洛谷P5020):动态规划与完全背包的巧妙应用

2018年NOIP货币系统解题报告(洛谷P5020):动态规划与完全背包的巧妙应用

一、题目解读2018年NOIP货币系统问题(洛谷P5020)要求给定一组货币面额,判断是否存在一种组合方式,使得所有不超过最大面额的金额都能被表示。例如,若面额集合为{1,3,5},则金额1~8均可被...

发表评论

访客

看不清,换一张

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