1.注意排名,在总分数和各个分数相同的情况下,排名必须相同
2.注意录取,学校记录一个最后录取学生的排名,当学校没有名额后,判断这个排名和当前申请的学生排名是否相等,如果相等,则必须录取这个学生
//#include<string>
//#include <iomanip>
//#include<stack>
//#include<unordered_set>
//#include <sstream>
//#include "func.h"
//#include <list>
#include<unordered_map>
#include<set>
#include<queue>
#include<map>
#include<vector>
#include <algorithm>
#include<stdio.h>
#include<iostream>
#include<string>
#include<memory.h>
#include<limits.h>
#include<stack>
using namespace std;
struct StudentNode{
int Ge, Gi;
int totalGrade;
int rank;
int id;
vector<int> choice;
StudentNode() :Ge(0), Gi(0), totalGrade(0), rank(-1), id(-1), choice(0){};
StudentNode(int x) :Ge(0), Gi(0), totalGrade(0), rank(-1), id(-1), choice(vector<int>(x,0)){};
};
struct SchoolNode{
int quato;
int lastRank;
vector<int> student;
SchoolNode() :quato(0), lastRank(0), student(0){};
};
bool cmp(const StudentNode&a, const StudentNode&b)
{
if (a.totalGrade > b.totalGrade)
return true;
else if (a.totalGrade == b.totalGrade && a.Ge > b.Ge)
return true;
else return false;
}
int main(void)
{
int studentSum, schoolSum, choiceSum;
cin >> studentSum >> schoolSum >> choiceSum;
vector<StudentNode> student(studentSum, StudentNode(choiceSum));
vector<SchoolNode> school(schoolSum);
for (int i = 0; i < school.size(); i++)
{//输入每个学校的招生名额
scanf("%d", &school[i].quato);
}
for (int i = 0; i < student.size(); i++)
{//输入学生信息
scanf("%d %d", &student[i].Ge, &student[i].Gi);
for (int j = 0; j < choiceSum; j++)
{//输入志愿
scanf("%d", &student[i].choice[j]);
}
student[i].totalGrade = student[i].Ge + student[i].Gi;
student[i].id = i;
}
sort(student.begin(), student.end(), cmp);
student[0].rank = 0;
for (int i = 1; i < student.size(); i++)
{//统计学生的排名
if (student[i].totalGrade == student[i - 1].totalGrade && student[i].Ge == student[i - 1].Ge)
student[i].rank = student[i - 1].rank;//所有成绩相等的学生排名一样
else
student[i].rank = i;
}
for (int i = 0; i < student.size(); i++)
{
for (int j = 0; j < student[i].choice.size(); j++)
{
int num = student[i].choice[j];
if (school[num].quato > 0 || (school[num].quato == 0 && school[num].lastRank == student[i].rank))
{//还有名额,或者,没有名额但是学校招收的最后一名的排名和当前学生排名一样,需要同样招收
if (school[num].quato>0)
school[num].quato--;
school[num].lastRank = student[i].rank;//更新学校招收学生的排名
school[num].student.push_back(student[i].id);//压入学生的id
break;//学生被录取了,不再遍历后面的志愿
}
}
}
for (int i = 0; i < school.size(); i++)
{
sort(school[i].student.begin(), school[i].student.end());//对学生的id进行排序
for (int j = 0; j < school[i].student.size(); j++)
{
printf("%d", school[i].student[j]);
if (j != school[i].student.size() - 1)
printf(" ");
}
printf("\n");
}
return 0;
}