題目:
題目大意:
輸入:考場數、一個考場的選手數、選手的編号和分數
輸出:選手的總人數、選手的編号、選手的總排名、選手所在的考場号、選手所在的當地排名(分數相同的排名相同)
思路:定義一個結構體,輸入時用sort函數對結構體進行排序,确定選手所在考場的排名;輸出時,确定選手的總排名
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Student{
long long id;
int score;
int local_num;//考場号
int local_rank;//地方排名
};
struct Student student[30020];
bool cmp(Student a,Student b)//比較方式,相同分數的按字典序排名
{
if(a.score!=b.score) return a.score > b.score;
else return a.id<b.id;
}
int main()
{
int n,k,num=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&k);
for(int j=0;j<k;j++)
{
scanf("%lld%d",&student[num].id,&student[num].score);
student[num].local_num=i;
num++;
}
sort(student+num-k,student+num,cmp);//對每個考場的分數進行排序
student[num-k].local_rank=1;
for(int j=1;j<k;j++)
{
if(student[num-k+j].score==student[num-k+j-1].score)
student[num-k+j].local_rank=student[num-k+j-1].local_rank;
else
student[num-k+j].local_rank=j+1;
}
}
printf("%d
",num);
sort(student,student+num,cmp);
int r=1;
for(int i=0;i<num;i++)
{
if(i>0&&student[i].score!=student[i-1].score)
r=i+1;
printf("%lld %d %d %d
",student[i].id,r,student[i].local_num,student[i].local_rank);
}
return 0;
}
最後一個點就是過不去≧ ﹏ ≦