您的位置:首页 > 其它

SDNU 1281.谁是第一名 水题 结构体排序 注意名字比较

2017-02-24 00:48 148 查看
1281.谁是第一名

Time Limit: 1000 MS    Memory Limit: 32768 KB
Total Submission(s): 210    Accepted Submission(s): 44

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

    其实这题并没什么好写的,不过因为一点小问题一直在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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: