1671: 凡事都要签到啦
题目描述
现在有学生的信息,有语数外三门课程的成绩,需要你帮我排序,排序的要求是,按照平均分从大到小排序,平均分一样的按照数学分数从大到小,数学分数还是一样的话,按照语文的分数从大到小排序,语文分数一样的按照外语分数从小到大排序。
输入
第一行一个整数n(n<=5000) 接下来n行每一行三个整数表示,数学,英语,语文的成绩(0<=成绩<=100)
输出
输出排序后的结果,每行四个数是该同学的 数学,语文,英语,和他的平均成绩(平均成绩保留两位小数)。
样例输入
2
1 2 3
3 2 1
样例输出
3 1 2 2.00
1 3 2 2.00
#include <bits/stdc++.h>
using namespace std;
struct su{
int math;
int chinese;
int english;
double ver;
}arr[5010];
bool compare(const su s1, const su s2)
{
if(s1.ver>s2.ver) return true;
else if(s1.ver==s2.ver)
{
if(s1.math>s2.math) return true;
else if(s1.math==s2.math)
{
if(s1.chinese>s2.chinese) return true;
else if(s1.chinese==s2.chinese)
{
if(s1.english>s2.english) return false;
else return true;
}
else return false;
}
else return false;
}
else return false;
}
int main()
{
int n,i,k;
while(~scanf("%d",&n))
{
for(i=0;i<n;i++)
{
scanf("%d%d%d",&arr[i].math,&arr[i].english,&arr[i].chinese);
arr[i].ver=(arr[i].math+arr[i].english+arr[i].chinese)/3.0;
}
sort(arr,arr+n,compare);
for(k=0;k<n;k++)
{
printf("%d %d %d %.2f\n",arr[k].math,arr[k].chinese,arr[k].english,arr[k].ver);
}
}
return 0;
}