ACM基础之结构体排序

问题 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 ",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