1. 程式人生 > >SDNUOJ 1281

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;
}