1671: 凡事都要签到啦
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 210 Solved: 47
[ Submit][ Status][ Web Board]
Description
现在有学生的信息,有语数外三门课程的成绩,需要你帮我排序,排序的要求是,按照平均分从大到小排序,平均分一样的按照数学分数从大到小,数学分数还是一样的话,按照语文的分数从大到小排序,语文分数一样的按照外语分数从小到大排序。
Input
第一行一个整数n(n<=5000) 接下来n行每一行三个整数表示,数学,英语,语文的成绩(0<=成绩<=100)
Output
输出排序后的结果,每行四个数是该同学的 数学,语文,英语,和他的平均成绩(平均成绩保留两位小数)。
Sample Input
2
1 2 3
3 2 1
Sample Output
3 1 2 2.00
1 3 2 2.00
解题思路:一:因为一个学生包含4个特征,数学,英语,语文和平均成绩。所以定义一个结构体数组来输入和保存数据。
二:因为题目要求对四个属性排序,所以考虑重写sort函数。
下面是我的代码:AC 了的;
#include <iostream>
#include<cstdio>
#include <algorithm>
using namespace std;
struct student
{
int math;
int english;
int chinese;
float avg;
}s[5005];
bool compare(const student s1, const student s2)
{
if(s1.avg>s2.avg) return true;
else if(s1.avg==s2.avg)
{
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 T;
while(scanf("%d",&T)!=EOF)
{
for(int i=0;i<T;i++)
{
scanf("%d%d%d",&s[i].math,&s[i].english,&s[i].chinese);
s[i].avg=(s[i].math+s[i].english+s[i].chinese)/3.00;
}
sort(s,s+T,compare);
for(int j=0;j<T;j++)
printf("%d %d %d %.2f\n",s[j].math,s[j].chinese,s[j].english,s[j].avg);
}
return 0;
}
#include<cstdio>
#include <algorithm>
using namespace std;
struct student
{
int math;
int english;
int chinese;
float avg;
}s[5005];
bool compare(const student s1, const student s2)
{
if(s1.avg>s2.avg) return true;
else if(s1.avg==s2.avg)
{
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 T;
while(scanf("%d",&T)!=EOF)
{
for(int i=0;i<T;i++)
{
scanf("%d%d%d",&s[i].math,&s[i].english,&s[i].chinese);
s[i].avg=(s[i].math+s[i].english+s[i].chinese)/3.00;
}
sort(s,s+T,compare);
for(int j=0;j<T;j++)
printf("%d %d %d %.2f\n",s[j].math,s[j].chinese,s[j].english,s[j].avg);
}
return 0;
}
遇到的问题:之前提交一直是WA,一直以为是自己的compare函数写错了。改了N遍,最后才发现是没有处理到文件末尾导致的
。但是题目并没有说,要处理到文件末尾,觉得有点坑。