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