题目1005:Graduate Admission
#include <stdio.h>
#include<queue>
#include<algorithm>
using namespace std;
struct student{
int id; //学生编号
int ge; //GE分数
int gi; //GI分数
double ave;
int school[6]; //申请的学校
int rank; //最终排名
}stu[40010];
struct school{
int id; //学校编号
int quota; //招生的名额数
int lRank; //最后一名的排名,相当于最低分数线。
priority_queue<int,vector<int>,greater<int> > stuId;
}sch[110];
bool cmp(student a,student b) //对学生进行排序。
{
if(a.ave!=b.ave)
return a.ave>b.ave;
else
return a.ge>b.ge;
}
int main()
{
int n,m,k,i,j;
//freopen("G:\\in.txt","r",stdin);
//-------------------进行输入----------------------
while(scanf("%d%d%d",&n,&m,&k)!=EOF){
for(i=0;i<m;i++)
scanf("%d",&sch[i].quota);
for(i=0;i<n;i++){
stu[i].id=i;
scanf("%d%d",&stu[i].ge,&stu[i].gi);
stu[i].ave=(double)(stu[i].ge+stu[i].gi)/2;
for(j=0;j<k;j++)
scanf("%d",&stu[i].school[j]);
}
//-------------------处理输入----------------------
sort(stu,stu+n,cmp);
for(i=0;i<n;i++){ //求出每个学生的排名
int cnt=1;
for(j=0;j<n;j++){
if(stu[j].ave>stu[i].ave)
cnt++;
else if(stu[j].ave=stu[i].ave){
if(stu[j].ge>stu[i].ge)
cnt++;
else{
stu[i].rank=cnt;
break; //找到排名则跳出循环查找
}
}
}
}
// for(i=0;i<n;i++)
// printf("**%d**",stu[i].rank);
for(i=0;i<n;i++){
for(j=0;j<k;j++){ //对于每个学生依次查询所感兴趣的学校有没有名额
if(sch[stu[i].school[j]].quota>0){ //如果学校有名额---------------------------则录取
sch[stu[i].school[j]].quota--;
sch[stu[i].school[j]].stuId.push(stu[i].id);
sch[stu[i].school[j]].lRank=stu[i].rank;
break;
}
if(sch[stu[i].school[j]].quota==0){ //如果没名额且但跟最后一名排名相等-------则录取
if(sch[stu[i].school[j]].lRank==stu[i].rank){
sch[stu[i].school[j]].stuId.push(stu[i].id);
break;
}
}
}
}
for(i=0;i<m;i++){
if(sch[i].stuId.empty())
printf("\n");
else{
printf("%d",sch[i].stuId.top()); //单独输出第一个元素以免前面有空格。
sch[i].stuId.pop();
while(!sch[i].stuId.empty()){
printf(" %d",sch[i].stuId.top());
sch[i].stuId.pop();
}
printf("\n");
}
}
}
return 0;
}