问题 E: 【排序】排名
时间限制: 1 Sec 内存限制: 64 MB题目描述
输入
输出
样例输入
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,现在在俱乐部与新生一起划水。