一、题目
7-3 学生成绩排序 (20 分)
给出一组学生名单(姓名和成绩),请输出按成绩从大到小排序后的结果(名次和姓名)。成绩相同的人拥有相同的名次,且按姓名的字典序从小到大排列。题目保证学生姓名没有重复。
输入格式:
第一行给出不大于10000的整数N。 接下来N行,每行给出学生姓名和成绩,以空格分隔。学生姓名不超过20个字符。
输出格式:
共输出N行,每行包含对应的学生排名和姓名,以空格分隔。
输入样例:
7
KongDezhen 94
FuTaotao 93
HuYu 94
XuJiecen 94
WuSuqi 96
ChenDa 93
HuNianbo 95
输出样例:
1 WuSuqi
2 HuNianbo
3 HuYu
3 KongDezhen
3 XuJiecen
6 ChenDa
6 FuTaotao
二、相关知识
1.冒泡排序的优化
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)//不用重复比较
2.最后的成绩相同名次相同输出那里,值得回顾
三、代码
#include<iostream>
#include<string.h>
using namespace std;
struct node{
char name[30];
int score;
};
int cmp(node x,node y)//比较函数
{
if(x.score==y.score)
return strcmp(x.name,y.name)>0;//成绩相同根据姓名字母
else
return y.score>x.score;//成绩不同根据成绩
}
int main()
{
int n,i,j;
cin>>n;
struct node a[10010],b;
for(i=0;i<n;i++)
{
cin>>a[i].name>>a[i].score;
}
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)//不用重复比较
{
if(cmp(a[i],a[j]))//j成绩大于i成绩,换
{
b=a[i];
a[i]=a[j];
a[j]=b;
}
}
int t=1;
for(i=1;i<=n;i++)
{
cout<<t<<" "<<a[i-1].name<<endl;;
if(a[i].score!=a[i-1].score)
{
t=i+1;//分数不相同,则排名加一
}
}
return 0;
}
程序是蓝色的诗