zcmu_1671

来源:互联网 发布:如何创建网络连接 编辑:程序博客网 时间:2024/05/22 15:49

1671: 凡事都要签到啦

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 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;
}
遇到的问题:之前提交一直是WA,一直以为是自己的compare函数写错了。改了N遍,最后才发现是没有处理到文件末尾导致的抓狂。但是题目并没有说,要处理到文件末尾,觉得有点坑。
0 0