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


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



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值