题目描述 新学期开始啦!少不了的一件事自然就是分配同桌 小胡的班级里有 n 个男生和 n个女生,男女生坐在一起,正好分成 n 对同桌 而为了促进同学们的学习进步,小胡决定根据每个同学的成绩情况进行分配同桌 首先小胡收集了每个同学的平均成绩,第 i 个男生的成绩为b[i] ,第 i 个女生的成绩为g[j] 如果由第 i个男生和第 j 个女生组成同桌,那么这一对同桌的成绩为 b[i]+g[j] 当分配完 n 对同桌以后,成绩最高的那一对同桌的成绩将代表这一次同桌分配方案的分配度 小胡认为,分配度越小,这一组分配方案越好,现在小胡想知道,最小的分配度是多少? 输入格式 第一行一个整数 n表示男女生人数。 接下来每行包含两个整数 b[i] 和 g[i]分别表示第 i 个男生和第 i 个女生的成绩。 输出格式 输出共 n 行,请计算每新增一对男女生时的最小分配度。c++
3条回答 默认 最新
电网论文源程序 2023-12-03 15:58关注这是一个求解同桌分配度的问题,可以通过对成绩进行排序,然后逐步计算分配度的方式来解决。以下是对应的C++代码:
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int n; cin >> n; vector<pair<int, int>> scores; // 存储成绩的向量,每个元素是一个pair,分别表示男生和女生的成绩 // 输入成绩 for (int i = 0; i < n; ++i) { int bi, gi; cin >> bi >> gi; scores.push_back({bi, gi}); } // 按男生和女生的成绩之和排序 sort(scores.begin(), scores.end(), [](const pair<int, int>& a, const pair<int, int>& b) { return a.first + a.second < b.first + b.second; }); int min_allocation = scores[0].first + scores[0].second; // 初始时,最小分配度为第一对同桌的成绩之和 // 逐步计算最小分配度并输出 for (int i = 1; i < n; ++i) { min_allocation = max(min_allocation, scores[i].first + scores[i - 1].second); cout << min_allocation << endl; } return 0; }这段代码首先按照男生和女生的成绩之和对同学们进行排序,然后逐步计算每新增一对男女生时的最小分配度,并输出结果。
解决评论 打赏 举报无用 1