结构体要写好。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iomanip>
using namespace std;
#define MAX 40000+10
struct Student
{
int Ge, Gi, sum;
int r;
int choice[6];
int d;
int stuid;
} stu[MAX];
struct School
{
int quote;
int stunum[MAX];
int cnt;
} sch[110];
int cmp(const void *a, const void *b)
{
struct Student* c = (Student *)a;
struct Student* d = (Student *)b;
if ((*c).sum != (*d).sum)
return (*d).sum - (*c).sum;
else
return (*d).Ge - (*c).Ge;
}
int cmp_num(const void *a, const void *b)
{
return *(int*)a - *(int*)b;
}
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
int N, M, K;
scanf("%d %d %d", &N, &M, &K);
for (int i = 0; i < M; i++)
scanf("%d", &sch[i].quote);
for (int i = 0; i < N; i++)
{
scanf("%d %d", &stu[i].Ge, &stu[i].Gi);
stu[i].sum = stu[i].Ge + stu[i].Gi;
stu[i].stuid = i;
for (int j = 0; j < K; j++)
scanf("%d", &stu[i].choice[j]);
}
//sort
qsort(stu, N, sizeof(stu[0]), cmp);
//rank
stu[0].r = 1;
for (int i = 0; i < N; i++)
if (stu[i].sum == stu[i-1].sum && stu[i].Ge == stu[i-1].Ge)
stu[i].r = stu[i-1].r;
else
stu[i].r = i+1;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < K; j++)
{
int c = stu[i].choice[j];
if (sch[c].cnt < sch[c].quote)
{
sch[c].stunum[sch[c].cnt++] = stu[i].stuid;
stu[i].d = c;
break;
}
else if (i-1>=0 && stu[i].r == stu[i-1].r && c == stu[i-1].d)
{
sch[c].stunum[sch[c].cnt++] = stu[i].stuid;
stu[i].d = c;
break;
}
}
}
for (int i = 0; i < M; i++)
{
qsort(sch[i].stunum, sch[i].cnt, sizeof(sch[i].stunum[0]), cmp_num);
for (int j = 0; j < sch[i].cnt; j++)
{
printf("%d", sch[i].stunum[j]);
if (j != sch[i].cnt-1)
printf(" ");
}
printf("\n");
}
return 0;
}