1281.谁是第一名
Total Submission(s): 210 Accepted Submission(s): 44
小明期末考试要考高数、计算机基础、英语三门学科,每科得分都是百分制,最后有个按照总分的排名,请你帮他算出他们班的第一名是谁。(总分=计算机基础*60%+高数*30%+英语*30%)如果若干人总分相同,则再按照计算机基础分高低取第一,如果还相同,再看数学...再看英语...如果三门成绩完全一样,则他们并列第一并按照名字升序输出。
第一行N,代表有N位同学参加排名,1≤N≤100
接下来的N行表示每一名同学的成绩,每一行首先是同学的名称,之后是该同学的成绩(计算机基础 高数 英语)。联系人的姓名不会超过50个字符,只包含英文大写字母。成绩均为百分制。
输出第一名,若成绩完全一样,按照姓名升序输出,每行一个名字
4
SQC 90 60 79
HC 60 90 90
ZJQ 80 85 92
RDJ 66 87 79
Sample Output
ZJQ
其实这题并没什么好写的,不过因为一点小问题一直在WA= =所以写出来提醒自己一下吧。
顺便,开学了不能再那么难懒了......存了一堆题了都还没写感觉当时的想法都忘的差不多了,该好好补补了,就以一道水题开个头吧。
给出一些条件然后排序,排出第一名输出,如果有几个人并列第一,则按名字排序,然后,就是这里出问题了,一开始我直接写的a.name<b.name.....结果就因为这里一直在WA,忽略了名字长度可能不同的问题...
下面AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct person
{
char name[55];
int math,eng,com;
double sum;
};
person p[105];
int cmp(person a,person b)
{
int i;
int len=max(strlen(a.name),strlen(b.name));
if(a.sum!=b.sum)
return a.sum>b.sum;
if(a.com!=b.com)
return a.com>b.com;
if(a.math!=b.math)
return a.math>b.math;
if(a.eng!=b.eng)
return a.eng>b.eng;
for(i=0;i<len;i++)
{
if(a.name[i]!=b.name[i])
return a.name[i]<b.name[i];
}
}
int main()
{
int n;
int i;
while(scanf("%d",&n)!=EOF)
{
memset(p,0,sizeof(p));
for(i=0;i<n;i++)
{
scanf("%s",p[i].name);
scanf("%d%d%d",&p[i].com,&p[i].math,&p[i].eng);
p[i].sum=p[i].com*0.6+p[i].math*0.3+p[i].eng*0.3;
}
sort(p,p+n,cmp);
cout<<p[0].name<<endl;
for(i=1;i<n;i++)
{
if(p[0].sum==p[i].sum&&p[0].com==p[i].com&&p[0].math==p[i].math&&p[0].eng==p[i].eng)
cout<<p[i].name<<endl;
else
break;
}
}
return 0;
}