大模拟……吐血
题目1005:Graduate Admission#include "iostream"
#include "stdio.h"
#include "math.h"
#include "map"
#include "vector"
#include "queue"
#include "memory.h"
#include "algorithm"
#include "string"
using namespace std;
#define N 40005
#define M 105
#define INF 1<<29
#define max(a,b) a>b?a:b
struct Stu
{
int ge;
int gi;
int prefer[10];
int id;
int selectschool;
}s[N];
int quota[M];
Stu score[M];
int rev[M][N];
int num[M];
int comp(const void *A,const void *B)
{
Stu* a=(Stu*)A;
Stu* b=(Stu*)B;
if(a->ge+a->gi==b->ge+b->gi)
return b->ge>a->ge;
return b->ge+b->gi>a->ge+a->gi;
}
int comp2(const void *A,const void *B)
{
Stu* a=(Stu*)A;
Stu* b=(Stu*)B;
return a->id-b->id;
}
bool Equal(Stu a,Stu b)
{
if(a.ge==b.ge&&a.gi==b.gi)
return true;
return false;
}
int main()
{
int n,m,k;
while(cin>>n>>m>>k)
{
int i,j,t;
for(i=0;i<m;i++)
cin>>quota[i];
for(i=0;i<n;i++)
{
scanf("%d%d",&s[i].ge,&s[i].gi);
s[i].id=i;
s[i].selectschool=-1;
for(j=0;j<k;j++)
scanf("%d",&s[i].prefer[j]);
}
qsort(s,n,sizeof(s[0]),comp);
for(i=0;i<n;i++)
{
for(j=0;j<k;j++)
{
int sch=s[i].prefer[j];
if(Equal(score[sch],s[i])||quota[sch]>0)
{
//rev[sch][num[sch]++]=s[i].id;
s[i].selectschool=sch;
score[sch].ge=s[i].ge;
score[sch].gi=s[i].gi;
quota[sch]--;
break;
}
}
}
memset(num,0,sizeof(num));
qsort(s,n,sizeof(s[0]),comp2);
for(i=0;i<n;i++)
{
int sch=s[i].selectschool;
if(sch!=-1)
rev[sch][num[sch]++]=s[i].id;
}
for(i=0;i<m;i++)
{
for(j=0;j<num[i]-1;j++)
printf("%d ",rev[i][j]);
if(num[i]-1>=0)
printf("%d",rev[i][num[i]-1]);
cout<<endl;
}
}
}