题意分析:
(1)给出多个考点的考试人数以及考生考号和成绩,求出所有参加考试的人最终排名、考场编号、本考场排名
(2)水题,考察排序,排名的规则按照以前的做法:按分数由高到低,同分同名次,不同分,按其在序列中的位置算排名
可能坑点:
#include <iostream>
#include <algorithm>
using namespace std;
struct testee
{
string ID;
int location;
int score;
int finalRank;
int localRank;
};
testee stu[30001];
bool cmp(testee a,testee b)
{
if(a.score!=b.score)return a.score>b.score;
else return a.ID<b.ID;
}
void getLocalRank(int start,int end)
{
stu[start].localRank=1;
int currentScore=stu[start].score;
int currentRank=stu[start].localRank;
for(int i=start;i<end;i++)
{
if(stu[i].score==currentScore)stu[i].localRank=currentRank;
else
{
stu[i].localRank=i+1-start;
currentScore=stu[i].score;
currentRank=stu[i].localRank;
}
}
}
void getFinalRank(int start,int end)
{
stu[start].finalRank=1;
int currentScore=stu[start].score;
int currentRank=stu[start].finalRank;
for(int i=start;i<end;i++)
{
if(stu[i].score==currentScore)stu[i].finalRank=currentRank;
else
{
stu[i].finalRank=i+1;
currentScore=stu[i].score;
currentRank=stu[i].finalRank;
}
}
}
int main()
{
int N,K,i=1,k=0;
cin>>N;
while(i<=N)
{
cin>>K;
int j=0;
while(j<K)
{
cin>>stu[k].ID>>stu[k].score;
stu[k].location=i;
k++;
j++;
}
sort(&stu[k-K],&stu[k],cmp);
getLocalRank(k-K,k);
i++;
}
sort(&stu[0],&stu[k],cmp);
getFinalRank(0,k);
cout<<k<<endl;
for(int i=0;i<k;i++)
{
cout<<stu[i].ID<<" "<<stu[i].finalRank<<" "<<stu[i].location<<" "<<stu[i].localRank<<endl;
}
return 0;
}