问题 E: 【排序】排名
时间限制: 1 Sec 内存限制: 64 MB
题目描述
班上刚测试了几门课,现在信息技术课的老师要分析一些功课之间的成绩关系,看看每个人的信息技术课成绩排名以及数学课成绩排名,并按信息技术课的成绩从高到低排列,如果两个人的信息技术课成绩相同,则学号小的排在前面。老师把任务交给了信息学最好的你,请你编程完成这个任务。
输入
第1行一个整数N,表示共有N个同学的成绩(1≤N≤45);后面有N行,每行4个整数,分别表示一个同学的:语文、数学、英语、信息技术成绩(成绩C:0≤C≤120)。
输出
共N行,每行6个数据,分别对应一个同学的语文、数学、英语、信息技术成绩和信息技术及数学成绩的排名。
样例输入
复制样例数据
3 90 95 89 110 95 120 78 115 96 97 103 92
样例输出
95 120 78 115 1 1 90 95 89 110 2 3 96 97 103 92 3 2 先上代码(C++):
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
struct stu
{
int ch,ma,en,co;//语文 数学 外语 信息成绩。
int mr;//数学排名。
int id;//学号。
};
int cmp(stu a,stu b)
{
if(a.ma==b.ma)
{
return a.id<b.id;
}
else
{
return a.ma>b.ma;
}
}
int cmp1(stu a,stu b)
{
if(a.co==b.co)
{
return a.id<b.id;
}
else
{
return a.co>b.co;
}
}
int main()
{
int n;
cin>>n;
stu s[n+5];
for(int i=0;i<n;i++)
{
cin>>s[i].ch>>s[i].ma>>s[i].en>>s[i].co;
s[i].id=i+1;
}
sort(s,s+n,cmp);
for(int i=0;i<n;i++)
{
s[i].mr=i+1;
}
sort(s,s+n,cmp1);
for(int i=0;i<n;i++)
{
printf("%d %d %d %d %d %d\n",s[i].ch,s[i].ma,s[i].en,s[i].co,i+1,s[i].mr);
}
return 0;
}
思路:
此问题明显考察的结构体排序,首先重写排序算法sort,cmp,对结构体里的“数学”元素ma进行排序,然后对结构体中的数学排名mr进行赋值。然后再次重写排序cmp1.为了省事,不对信息co进行赋予排名,直接输出i+1,
注意:
重写结构体时候不能漏掉“若成绩相同时候按照学号排序”此点,故重写时候进行简单的if判定。
PS:菜鸟一个,大一放弃过ACM,现在在俱乐部与新生一起划水。
原文地址:https://www.cnblogs.com/shdwin/p/10200633.html