用c++语言链表写以下程序:现有 m 所学校,每所学校预计分数线是 ai 。有 n 位学生,估分分别为 bi。 根据 n 位学生的估分情况,分别给每位学生推荐一所学校,要求学校的预计分数线和学生的估分相差最小(可高可低,毕竟是估分嘛),这个最小值为不满意度。求所有学生不满意度和的最小值。 输入格式 第一行读入两个整数 m,n。m表示学校数,n表示学生数。 第二行共有 m个数,表示 m个学校的预计录取分数。第三行有 n个数,表示 n个学生的估分成绩。 输出格式 输出一行,为最小的不满度之和。
时间: 2024-02-06 16:12:15 浏览: 56
以下是用 C++ 实现的链表程序:
```cpp
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
struct School
{
int score;
School* next;
School(int x) : score(x), next(NULL) {}
};
struct Student
{
int score;
Student* next;
Student(int x) : score(x), next(NULL) {}
};
int m, n;
School* schools;
Student* students;
int main()
{
cin >> m >> n;
// 构建学校链表
schools = new School(0); // 头节点
for (int i = 0; i < m; i++)
{
int x;
cin >> x;
School* p = schools;
while (p->next && p->next->score < x) p = p->next; // 找到第一个大于等于 x 的位置
School* node = new School(x);
node->next = p->next;
p->next = node;
}
// 构建学生链表
students = new Student(0); // 头节点
for (int i = 0; i < n; i++)
{
int x;
cin >> x;
Student* p = students;
while (p->next && p->next->score < x) p = p->next; // 找到第一个大于等于 x 的位置
Student* node = new Student(x);
node->next = p->next;
p->next = node;
}
int res = 0;
School* p = schools->next; // 跳过头节点
Student* q = students->next; // 跳过头节点
while (q)
{
while (p->next && p->next->score < q->score) p = p->next; // 找到第一个大于等于 q->score 的位置
int d = abs(p->score - q->score);
if (p != schools->next) d = min(d, abs(p->next->score - q->score)); // 考虑学校分数线低于估分的情况
res += d;
q = q->next;
}
cout << res << endl;
return 0;
}
```
程序思路:
首先,我们将学校的预计录取分数存储在一个链表中,将学生的估分成绩存储在另一个链表中。
对于每个学生,我们找到学校分数线中第一个大于等于学生估分的位置,计算学生估分与学校分数线差值的绝对值,然后将其加入不满意度中。
需要考虑学校分数线低于估分的情况,这时我们还需要找到学校分数线中第一个小于学生估分的位置,计算其与学生估分的差值,取其与上一步计算结果的较小值。
最后,输出所有学生不满意度和的最小值。
阅读全文