//
// main.cpp
// PATA1080
//
// Created by Phoenix on 2018/2/18.
// Copyright © 2018年 Phoenix. All rights reserved.
//
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 40010;
int n, m, k;
int school[110];
struct node {
int id;
int Ge, Gi;
int sch[6];
}stu[maxn];
bool cmp(node a, node b) {
if(a.Ge + a.Gi != b.Ge + b.Gi) return a.Ge + a.Gi > b.Ge + b.Gi;
else return a.Ge > b.Ge;
}
int main(int argc, const char * argv[]) {
scanf("%d %d %d", &n, &m, &k);
for(int i = 0; i < m; i++) {
scanf("%d", &school[i]);
}
for(int i = 0; i < n; i++) {
stu[i].id = i;
scanf("%d %d", &stu[i].Ge, &stu[i].Gi);
for(int j = 0; j < k; j++) {
scanf("%d", &stu[i].sch[j]);
}
}
sort(stu, stu + n, cmp);
vector<int> s[m];
int grade[m][2];
for(int i = 0; i < n; i++) {
for(int j = 0; j < k; j++) {
int sch = stu[i].sch[j];
if(school[sch]) {
s[sch].push_back(stu[i].id);
school[sch]--;
if(school[sch] == 0) {
grade[sch][0] = stu[i].Ge;
grade[sch][1] = stu[i].Gi;
}
break;
}
if(school[sch] == 0 && stu[i].Ge == grade[sch][0] && stu[i].Gi == grade[sch][1]) {
s[sch].push_back(stu[i].id);
break;
}
}
}
for(int i = 0; i < m; i++) {
sort(s[i].begin(), s[i].end());
for(int j = 0; j < s[i].size(); j++) {
printf("%d", s[i][j]);
if(j < s[i].size() - 1) printf(" ");
}
printf("\n");
}
return 0;
}
PATA1080题解
最新推荐文章于 2021-08-18 23:03:18 发布