SDNUOJ 1281

Description
小明期末考试要考高数、计算机基础、英语三门学科,每科得分都是百分制,最后有个按照总分的排名,请你帮他算出他们班的第一名是谁。(总分=计算机基础60%+高数30%+英语*30%)如果若干人总分相同,则再按照计算机基础分高低取第一,如果还相同,再看数学…再看英语…如果三门成绩完全一样,则他们并列第一并按照名字升序输出。
Input
第一行N,代表有N位同学参加排名,1≤N≤100

接下来的N行表示每一名同学的成绩,每一行首先是同学的名称,之后是该同学的成绩(计算机基础 高数 英语)。联系人的姓名不会超过50个字符,只包含英文大写字母。成绩均为百分制。

Output
输出第一名,若成绩完全一样,按照姓名升序输出,每行一个名字

Sample Input
4
SQC 90 60 79
HC 60 90 90
ZJQ 80 85 92
RDJ 66 87 79
Sample Output
ZJQ

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;

struct grade
{
    char name[55];
    double computer;///double比int更精确,可当成int用
    double math;
    double english;
    double sum;
} a[105];

int cmp(grade a,grade b)
{
    if(a.sum!=b.sum)
        return a.sum<b.sum;
    else
    {
        if(a.computer!=b.computer)
            return a.computer<b.computer;
        else
        {
            if(a.math!=b.math)
                return a.math<b.math;
            else
            {
                if(a.english!=b.english)
                    return a.english<b.english;
                else
                {
                    ///名字升序的一种比较方法,不能写return a.name < b.name也不能写(详情请看我的另一篇博客字符串升序)return(strcmp(a.name,b.name)<0)
                    int len = max(strlen(a.name), strlen(b.name));
                    for(int i=0; i<len; i++)
                    {
                        if(a.name[i]!=b.name[i])
                            return a.name[i]<b.name[i];
                    }
                }
            }
        }
    }
}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        for(int i=0; i<n; i++)
        {
            scanf("%s",a[i].name);
            scanf("%lf%lf%lf",&a[i].computer,&a[i].math,&a[i].english);
            a[i].sum=0.6*a[i].computer+0.3*a[i].math+0.3*a[i].english;
        }
        sort(a,a+n,cmp);
        cout<<a[n-1].name<<endl;
        for(int i=n-2; i>=0; i--)
        {
            if(a[i].sum==a[n-1].sum && a[i].computer == a[n-1].computer && a[i].math == a[n-1].math && a[i].english == a[n-1].english)
            {
                cout<<a[i].name<<endl;
            }
            else
                break;
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhaobaole2018/article/details/84881352