1080 Graduate Admission (30 分)
题意
给出一组学生信息,包括笔试成绩和面试成绩,以及报名的学校。
给出所有学校的录取名额,输出每个学校录取的学生id,id从小到大输出。每所学校输出占一行,无录取学生则输出空行。
总成绩高的学生优先,同情况下笔试成绩高的学生优先。当两个学生所有成绩相同时可都录取(允许超出录取名额)。
思路
建立结构体,包括id,笔试,面试,总成绩,报名的学校。
建立数组schools存储学校录取名额,pass存储学校录取学生id,counts记录学校已录取人数,last记录最后一名录取学生成绩。
输入时同时记录学生id,否则之后排序会打乱。
按要求排序,遍历学生信息。
当学校录取满员时判断最后一名成绩与当前学生成绩,如果相同则录取。
输出时给录取学生id排序。
代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef struct node{
int exam,interview,prefer[107],number;
double final;
}node;
bool cmp(node x,node y)
{
if(x.final==y.final){
return x.exam>y.exam;
}else{
return x.final>y.final;
}
}
node students[1000007];
int schools[107],pass[107][4007],counts[107],last[107][2];
void function(int n,int m,int k)
{
int x,y,z,q;
memset(counts,0,sizeof(counts));
for(int i=0;i<n;i++){
for(int j=0;j<k;j++){
x=students[i].prefer[j];
y=students[i].interview;
z=students[i].exam;
q=students[i].number;
// printf("")
if(counts[x]<schools[x]||(counts[x]>=schools[x]&&y==last[x][1]&&z==last[x][0])){
last[x][0]=z;
last[x][1]=y;
pass[x][counts[x]]=q;
counts[x]++;
break;
}
}
}
for(int i=0;i<m;i++){
sort(pass[i],pass[i]+counts[i]);
for(int j=0;j<counts[i];j++){
if(j!=0){
printf(" ");
}
printf("%d",pass[i][j]);
}
printf("\n");
}
}
int main()
{
int n,m,k,x,y,z;
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<m;i++){
scanf("%d",&schools[i]);
}
for(int i=0;i<n;i++){
scanf("%d%d",&x,&y);
students[i].exam=x;
students[i].interview=y;
students[i].number=i;
students[i].final=(x+y)/2;
for(int j=0;j<k;j++){
scanf("%d",&z);
students[i].prefer[j]=z;
}
}
sort(students,students+n,cmp);
function(n,m,k);
return 0;
}