牛客网13256头条校招解析:贪心算法解决题目分组难题
一、问题分析
本题需要将n道题目分组,每组3道题目满足特定难度条件,求最少需要补充的题目数量。关键在于如何高效地分组现有题目,最小化补充题目。
二、C++解决方案
#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; ) { // 检查是否能组成有效三元组 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)
贪心策略:
优先尝试组成完整三元组
次优组成二元组+补充1题
最后处理单独题目+补充2题
边界处理:
处理数组末尾不足3题的情况
确保所有题目都被处理
四、常见错误
扩展思考
如果分组条件变化如何调整算法?
如何处理更大规模的数据?
如何扩展为动态难度调整?
原创内容 转载请注明出处