原题链接:PTA | 程序设计类实验辅助教学平台
题目:

Sample Input
2
5
1234567890001 95
1234567890005 100
1234567890003 95
1234567890002 77
1234567890004 85
4
1234567890013 65
1234567890011 25
1234567890014 100
1234567890012 85
思路:
1:按照考场读入考生信息,读入完毕,对该考场考生进行排序,用第一种方式计算排名,并储存在结构中的考场内排名rank中
2.对所有的考生进行排名
3.利用第二种方式进行计算排名(可以之间输出排名),并且完成整道题的输出
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxsize=30010;
struct student{
char id[15];
int score;
int number;//考场号
int rank;//考场内排名
}stu[maxsize];
bool cmp(student a,student b){
if(a.score!=b.score) return a.score>b.score;
else return strcmp(a.id,b.id)<0;//str1<str2 返回<0
}
int main()
{
int n,num=0;//num考场总人数
cin>>n;
for(int i=1;i<=n;i++){//遍历输入考场
int k;
cin>>k;
for(int j=0;j<k;j++){//遍历输入每个考场的考生
cin>>stu[num].id;
cin>>stu[num].score;
stu[num].number=i;
num++;
}
sort(stu+num-k,stu+num,cmp);//考场内学生的排序
stu[num-k].rank=1;//将考场的第1名赋值为1
for(int j=num-k+1;j<num;j++){
if(stu[j].score==stu[j-1].score){
stu[j].rank=stu[j-1].rank;
}
else{
stu[j].rank=j+1-(num-k);
}
}
}
cout<<num<<endl;
sort(stu+0,stu+num,cmp);
int r=1;//总人数排名
for(int i=0;i<num;i++){
if(i>0&&stu[i].score!=stu[i-1].score){
r=i+1;
}
cout<<stu[i].id<<' '<<r<<' '<<stu[i].number<<' '<<stu[i].rank<<endl;
}
return 0;
}
注意要点:
1.
sort(stu+num-k,stu+num,cmp)这一行不能写成
sort(stu[num-k],[stu+num],cmp)
因为
-
stu + num - k表示指向数组stu中第num-k个元素的指针,stu是一个指向student类型数组的指针,num是数组的总人数,k是当前考场的学生人数。因此,stu + num - k是指向当前考场的第一个学生(因为每个考场排序前的位置是num - k)。 -
stu[num-k]直接访问数组中的第num-k个元素,表示数组中具体的第num-k个学生。 stu[num-k]是数组中一个具体的student元素,而stu[num-k], [stu+num]这样的写法不符合 C++ 的语法规则。[stu+num]是错误的,因为[]是数组下标运算符,并不能用于指针表示法中。
2.由于num和考场都在改变所以,每次给rank赋值以及排序,都要考虑道范围的变化
204

被折叠的 条评论
为什么被折叠?



