这一题信息量比较大,不仅要对学生成绩进行排序,还要对学校所收录的学生进行排序。另外,还要考虑到名次相同的学生必须被一块录取。
算法步骤:
- 建立结构体
- 编写比较函数
- 将输入数据存储到数组中
- 排序
- 记录学生名次
- 遍历学生的选择。如果目标学校有名额,则互相选择,反之,则比较该学生选择的学校和前一个学生的录取学校,若两者一致,则将该学生分配给该学校
- 按名次输出学校录取名单
关键点:
- 学校名额已满,如何处理其余报考该校的学生
- 学校的录取名单是按顺序输出
核心代码:
学生和学校的双向选择
for (int i = 0; i < n; i++)
{
//假设未被学校录取
students[i].school = -1;
for (int j = 0; j < k; j++)
{
int tempschool = students[i].choice[j];
if (school[tempschool] > 0)
{
school[tempschool]--;
students[i].school = tempschool;
break;
}
else if (i > 0 && students[i].rank == students[i - 1].rank)
{
if (students[i - 1].school == tempschool)
{
students[i].school = students[i - 1].school;
school[students[i].school]--;
break;
}
}
}
}
代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
/*根据平均分排序,相同则根据GE,再相同则名次相等,实际上是看名次
遍历循环学生选择*/
struct student
{
int id;
int ge;
int gi;
double finalGrade;
int rank;
int choice[5];
int school;
} students[40005];
bool cmp(student a, student b)
{
if (a.finalGrade != b.finalGrade)
{
return a.finalGrade > b.finalGrade;
}
else
{
return a.ge > b.ge;
}
}
int main()
{
int n, m, k;
scanf("%d %d %d", &n, &m, &k);
int school[m];
for (int i = 0; i < m; i++)
{
scanf("%d", &school[i]);
}
for (int i = 0; i < n; i++)
{
students[i].id = i;
scanf("%d %d", &students[i].ge, &students[i].gi);
students[i].finalGrade = (students[i].ge + students[i].gi) / 2.0;
for (int j = 0; j < k; j++)
{
scanf("%d", &students[i].choice[j]);
}
}
sort(students, students + n, cmp);
students[0].rank = 1;
for (int i = 1; i < n; i++)
{
if ((students[i].finalGrade == students[i - 1].finalGrade) &&
(students[i].ge == students[i - 1].ge))
{
students[i].rank = students[i - 1].rank;
}
else
{
students[i].rank = i + 1;
}
}
for (int i = 0; i < n; i++)
{
//假设未被学校录取
students[i].school = -1;
for (int j = 0; j < k; j++)
{
int tempschool = students[i].choice[j];
if (school[tempschool] > 0)
{
school[tempschool]--;
students[i].school = tempschool;
break;
}
else if (i > 0 && students[i].rank == students[i - 1].rank)
{
if (students[i - 1].school == tempschool)
{
students[i].school = students[i - 1].school;
school[students[i].school]--;
break;
}
}
}
}
for (int i = 0; i < m; i++)
{
int a[40005];
int cnt = 0;
bool flag = false;
for (int j = 0; j < n; j++)
{
if (students[j].school == i)
{
a[cnt++] = students[j].id;
}
}
sort(a, a + cnt);
for (int j = 0; j < cnt; j++)
{
if (flag == false)
{
printf("%d", a[j]);
flag = true;
}
else
{
printf(" %d", a[j]);
}
}
printf("\n");
}
}