#include<iostream>
#include<vector>
#include<algorithm>
#include<unordered_map>
using namespace std;
struct node{
int id,ge;
double final;
};
bool cmp(node &a,node&b){
if(a.final!=b.final) return a.final>b.final;
else return a.ge>b.ge;
}
vector<node> v;
int main(){
int n,m,k,gee,gii,p1,p2,p3;
double fin;
scanf("%d %d %d",&n,&m,&k);
vector<int> q[n];
int book[n];
int a[m];
for(int i=0;i<m;i++){
scanf("%d",&a[i]);//scanf 又忘带&导致转几个圈出错,以后特别检查一下(注意)
}
for(int i=0;i<n;i++){
scanf("%d %d",&gee,&gii);
fin=(gee+gii)*1.0/2;
v.push_back({i,gee,fin});
for(int j=0;j<k;j++){
int temp;
scanf("%d",&temp);
q[i].push_back(temp);
}
}
sort(v.begin(),v.end(),cmp);
int rank=0;
node pre;
pre.ge=-1;
unordered_map <int,int> ran;
for(int i=0;i<n;i++){
if(pre.final==v[i].final&&pre.ge==v[i].ge){//写了pre忘打pre(注意)
ran[v[i].id]=rank;
}
else{
rank++;
ran[v[i].id]=rank;
}
pre=v[i];
}
int prer=-1;
vector<int>aa[m];
for(int i=0;i<n;i++){
for(int j=0;j<k;j++){
int temp1=ran[v[i].id];
int temp2=ran[prer];
if(a[q[v[i].id][j] ]>0 ){
aa[q[v[i].id][j]].push_back(v[i].id);
a[q[v[i].id][j]]--;
book[v[i].id]=q[v[i].id][j];
break;
}
else if(a[q[v[i].id][j]]==0&&temp1==temp2 &&book[prer]==q[v[i].id][j]){
aa[q[v[i].id][j]].push_back(v[i].id);
book[v[i].id]=q[v[i].id][j];
break;
}
}
prer=v[i].id;
}
for(int i=0;i<m;i++){
sort(aa[i].begin(),aa[i].end());
}
for(int i=0;i<m;i++){
if(aa[i].size()!=0)
for(int j=0;j<aa[i].size();j++){
if(j!=0) printf(" ");
printf("%d",aa[i][j]);
if(j==aa[i].size()-1) printf("\n");
}
else printf("\n");
}
return 0;
}
用时两个小时其他的没啥,太慢
总结
1. //scanf 又忘带&导致转几个圈出错,以后特别检查一下(注意)
2.//写了pre忘打pre(注意)
3.注意一下这里如果rank相同,并且前面的人已经被录取了,才能录同rank的所以要加判断book【prer】==此学校
4.注意成绩排名问题同名次的rank写法
英语
问题 总结一下里面可用的模板 我觉得这种问题要分类型整理
比如成绩排序问题,等把相同类型的纵向做一个总结经常用到哪一块代码提高速度
·