zcmu--1671: 凡事都要签到啦(结构体&&cmp定义)

1671: 凡事都要签到啦

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 424  Solved: 119
[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

【分析】比较坑的一点是按英语成绩升序排序,,,,没有仔细看题,也让它降序了。然后重定义cmp函数时,因为有有int型又有double型,所以用bool型比较方便一点。注释掉的是错误的cmp定义。

#include <bits/stdc++.h>
using namespace std;
struct student{
	int math;
	int english;
	int chinese;
	double avg;
}st[5010];
//int cmp1(student x,student y)
//{
//	if(x.math!=y.math)return x.math>y.math;
//	if(x.chinese!=y.chinese)return x.chinese>y.chinese;
//	if(x.english!=y.english)return x.english<y.english;
//}
//double cmp(student x,student y)
//{
//	if(x.avg!=y.avg)return x.avg>y.avg;
//	else cmp1(x,y);
//}
bool cmp(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 n,sum;
	while(~scanf("%d",&n))
	{
		for(int i=0;i<n;i++)
		{
			scanf("%d%d%d",&st[i].math,&st[i].english,&st[i].chinese);
			sum=st[i].chinese+st[i].english+st[i].math;
			st[i].avg=sum/3.0;
		}
		sort(st,st+n,cmp);
		for(int i=0;i<n;i++)
			printf("%d %d %d %.2lf\n",st[i].math,st[i].chinese,st[i].english,st[i].avg);
	}

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38735931/article/details/81662141