#include<bits/stdc++.h>
using namespace std;
struct Apply
{
int grade_e;
int grade_i;
int total_grade;
int choices[5];
int Rank;
int num;
}a[40000];
struct School
{
int quote;
int con = 0;
int students[40000];
}s[100];
bool cmp(Apply a1, Apply a2)
{
if (a1.total_grade != a2.total_grade)
return a1.total_grade > a2.total_grade;
else
return a1.grade_e > a2.grade_e;
}
int main()
{
int n, m, k;
cin >> n >> m >> k;
for(int i = 0; i < m; i++)
scanf("%d", &s[i].quote);
for(int i = 0; i < n; i++)
{
scanf("%d %d",&a[i].grade_e, &a[i].grade_i);
a[i].total_grade = a[i].grade_e + a[i].grade_i;
a[i].num = i;
for(int ii = 0; ii < k; ii++)
scanf("%d", &a[i].choices[ii]);
}
sort(a, a + n, cmp);
a[0].Rank = 1;
for(int i = 1; i < n; i++)
{
if (a[i].total_grade != a[i - 1].total_grade)
a[i].Rank = i + 1;
else
{
if(a[i].grade_e != a[i - 1].grade_e)
a[i].Rank = i + 1;
else
a[i].Rank = a[i - 1].Rank;
}
}
int last_ad;
for(int i = 0; i < n; i++)
{
for(int ii = 0; ii < k; ii++)
{
int c = a[i].choices[ii];
if ((s[c].con < s[c].quote) || (a[i].Rank == a[i - 1].Rank && c == last_ad))
{
s[c].students[s[c].con] = a[i].num;
s[c].con++;
last_ad = c;
break;
}
}
}
for(int i = 0; i < m; i++)
{
if (s[i].con > 0)
{
sort(s[i].students, s[i].students + s[i].con);
for(int ii = 0; ii < s[i].con; ii++)
{
printf("%d", s[i].students[ii]);
if (ii != s[i].con - 1)
printf(" ");
}
printf("\n");
}
else
printf("\n");
}
return 0;
}
PAT A1080 题解
最新推荐文章于 2024-05-28 09:37:13 发布