结构体排序问题,可用vector<node> v[105] 分别来保存每个考场考生的信息,分别对每个考场的学生按照成绩来排序得出每个考场的排名,再将学生全部存到总的vector中并排序,得出这次考试全部学生的排名,注意分数相同排名一样。
ac代码:
#include<iostream> #include<cstring> #include<algorithm> #include<cstdlib> #include<cstdio> #include<cmath> #include<stack> #define eps 10000000 #include<queue> #include<map> #include<set> using namespace std; struct node { int id; string r_id; int fenshu; int rank1; int rank2; }; bool cmp(node x,node y) { return x.fenshu<y.fenshu; } bool cmp1(node x,node y) { if(x.fenshu!=y.fenshu) return x.fenshu<y.fenshu; else return x.r_id>y.r_id; } int main() { int n; cin>>n; vector<node> v[105]; vector<node> vv; int sum=0; for(int i=0;i<n;i++) { int k; cin>>k; sum+=k; for(int j=0;j<k;j++) { node tmp; tmp.id=i+1; cin>>tmp.r_id>>tmp.fenshu; v[i+1].push_back(tmp); } } cout<<sum<<endl; for(int i=1;i<=n;i++) { sort(v[i].begin(),v[i].end(),cmp); int d=v[i].size(); v[i][d-1].rank1=1; for(int j=d-2;j>=0;j--) { if(v[i][j].fenshu==v[i][j+1].fenshu) { v[i][j].rank1=v[i][j+1].rank1; } else { v[i][j].rank1=d-j; } } for(int j=0;j<d;j++) { vv.push_back(v[i][j]); } } sort(vv.begin(),vv.end(),cmp1); int d=vv.size(); //cout<<d<<endl; vv[d-1].rank2=1; cout<<vv[d-1].r_id<<" "<<vv[d-1].rank2<<" "<<vv[d-1].id<<" "<<vv[d-1].rank1<<endl; for(int j=d-2;j>=0;j--) { if(vv[j].fenshu==vv[j+1].fenshu) { vv[j].rank2=vv[j+1].rank2; } else { vv[j].rank2=d-j; } cout<<vv[j].r_id<<" "<<vv[j].rank2<<" "<<vv[j].id<<" "<<vv[j].rank1<<endl; } }