一道水题。
题目地址:http://pat.zju.edu.cn/contests/pat-a-practise/1080
代码如下:
#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
struct student{
int ge;
int gi;
int avg;
int zy[6];
int no;
bool operator < (const student &s) const{
if(avg==s.avg){
return ge>s.ge;
}
return avg>s.avg;
}
}stu[40001],sstu[40001];//注意到排序后编号的问题
vector<int> res[101];
int main()
{
int n,m,k;
int sch[101];
int csch[101]={0};
while(scanf("%d%d%d",&n,&m,&k)!=EOF){
for(int i=0;i<m;i++){
scanf("%d",&sch[i]);
res[i].clear();
}
for(int i=0;i<n;i++){
scanf("%d%d",&stu[i].ge,&stu[i].gi);
stu[i].no=i;
stu[i].avg=(stu[i].ge+stu[i].gi)/2;
sstu[i].ge=stu[i].ge;
sstu[i].avg=stu[i].avg;
for(int j=0;j<k;j++)
scanf("%d",&stu[i].zy[j]);
}
sort(stu,stu+n);
for(int i=0;i<n;i++){
for(int j=0;j<k;j++){
if(csch[stu[i].zy[j]]<sch[stu[i].zy[j]]){
csch[stu[i].zy[j]]++;
res[stu[i].zy[j]].push_back(stu[i].no);
break;
}
else{
int tmp=res[stu[i].zy[j]].back();
if(sstu[tmp].avg==stu[i].avg&&sstu[tmp].ge==stu[i].ge){
res[stu[i].zy[j]].push_back(stu[i].no);
break;
}
}
}
}
for(int i=0;i<m;i++){
if(res[i].size()==0) printf("\n");
else{
sort(res[i].begin(),res[i].end());
printf("%d",res[i][0]);
for(int j=1;j<(signed)res[i].size();j++)
printf(" %d",res[i][j]);
printf("\n");
}
}
}
return 0;
}