zoukankan      html  css  js  c++  java
  • 牛客小白月赛3 I 排名【结构体排序/较复杂/细节】

    链接:https://www.nowcoder.com/acm/contest/87/I
    来源:牛客网
    
    题目描述 
    Cwbc和XHRlyb都参加了SDOI2018,他们特别关心自己的排名。
    我们定义每一场比赛每位选手的标准分为它的分数乘以满分再除以比赛中选手所获得的最高分。
    NOIP2017的满分为600分,SDOI2018每一天的比赛满分均为300分。
    我们定义总分为NOIP2017的标准分的25%,加上SDOI2018 前两天标准分之和的25%,再加上SDOI2018后两天标准分之和的50%。
    XHRlyb告诉你每一次比赛每个选手的分数,你需要按照名次从高到低依次输出他们的名字和总分。
    聪明的你在仔细阅读题目后,一定可以顺利的解决这个问题!
    输入描述:
    输入数据有多组数据,对于每组数据,格式为:
    第一行,一个整数n,表示选手数量。
    接下来n行,每一行有用空格隔开的一个字符串和五个整数,分别表示选手姓名、NOIP2017成绩以及SDOI2018四天比赛的成绩。
    输出描述:
    输出数据应有多组,每组输出有多行,每行应有一个选手姓名和他的总分。
    输出的总分应保留5位小数,且如果总分的误差不超过10-5,我们认为两名选手并列。
    若两名选手并列,则按姓名的字典序顺序从小到大输出。
    示例1
    输入
    7
    tzt 570 290 155 300 295
    tyc 570 260 225 295 300
    rqy 540 275 110 290 290
    cz 520 260 130 285 290
    hly 490 185 155 290 285
    zhx 510 220 110 285 285
    dzm 510 185 85 280 280
    输出
    tyc 589.74138
    tzt 574.16667
    rqy 539.89262
    cz 534.91682
    hly 515.95886
    zhx 512.77374
    dzm 490.38869
    备注:
    保证姓名均为小写字母且个数在[2,10]之间,每次比赛的分数不会超过满分也不会低于0分。
    保证选手总数不会超过2 ∗ 1051 ≤ T ≤ 5

    【分析】:注意是比赛中 选手 所获得的最高分!纵向比较!

    【代码】:

    #include<bits/stdc++.h>
    /*
    7
    tzt 570 290 155 300 295
    tyc 570 260 225 295 300
    rqy 540 275 110 290 290
    cz 520 260 130 285 290
    hly 490 185 155 290 285
    zhx 510 220 110 285 285
    dzm 510 185 85 280 280
    */
    using namespace std;
    #define ll long long
    #define ull unsigned long long
    #define mod 1000000007
    #define inf 0x3f3f3f3f
    const int N = 2*1e5+5;
    struct node
    {
        string name;
        int s[5];
        double sum;
    }a[N];
    bool cmp(node a, node b)
    {
        //如果总分的误差不超过10-5,我们认为两名选手并列
        //两名选手并列,则按姓名的字典序顺序从小到大输出
        if (fabs(a.sum-b.sum)<=1e-5) return a.name<b.name;
        else
            return a.sum>b.sum;
    }
    
    int main()
    {
        int n;
        while(cin>>n)
        {
    
            int Max[50];
            memset(Max,-1,sizeof Max);
            for(int i=0;i<n;i++)
                a[i].sum=0;
    
            for(int i=0;i<n;i++)
            {
                cin>>a[i].name;
                for(int j=0;j<5;j++)
                {
                    cin>>a[i].s[j];
                    Max[j] = max(Max[j],a[i].s[j]);
                }
            }
    
            for(int i=0;i<n;i++)
            {
                for(int j=0; j<5; j++)
                {
                    if(j==0)
                    {
                        a[i].sum += (a[i].s[0]*600.0/Max[0])*0.25;
                    }
                    if(j>0&&j<=2)
                    {
                         a[i].sum += (a[i].s[j]*300.0/Max[j])*0.25;
                    }
                    if(j>2&&j<5)
                    {
                        a[i].sum += (a[i].s[j]*300.0/Max[j])*0.5;
                    }
                }
            }
            sort(a,a+n,cmp);
    
            for(int i=0;i<n;i++)
            {
                cout<<a[i].name;
                printf(" %.5f
    ",a[i].sum);
            }
        }
    }
    #include<bits/stdc++.h>
    /*
    7
    tzt 570 290 155 300 295
    tyc 570 260 225 295 300
    rqy 540 275 110 290 290
    cz 520 260 130 285 290
    hly 490 185 155 290 285
    zhx 510 220 110 285 285
    dzm 510 185 85 280 280
    */
    using namespace std;
    #define ll long long
    #define ull unsigned long long
    #define mod 1000000007
    #define inf 0x3f3f3f3f
    const int N = 2*1e5+5;
    struct node
    {
        string name;
        int s[5];
        double sum;
    }a[N];
    bool cmp(node a, node b)
    {
        //如果总分的误差不超过10-5,我们认为两名选手并列
        //两名选手并列,则按姓名的字典序顺序从小到大输出
        if (fabs(a.sum-b.sum)<=1e-5) return a.name<b.name;
        else
            return a.sum>b.sum;
    }
     
    int main()
    {
        int n;
        while(cin>>n)
        {
     
            int Max[50];
            memset(Max,-1,sizeof Max);
            for(int i=0;i<n;i++)
                a[i].sum=0;
     
            for(int i=0;i<n;i++)
            {
                cin>>a[i].name;
                for(int j=0;j<5;j++)
                {
                    cin>>a[i].s[j];
                    Max[j]=max(Max[j],a[i].s[j]);
                }
            }
     
            for(int i=0;i<n;i++)
            {
                    a[i].sum += a[i].s[0]*600/(double)Max[0]*0.25;
                for(int j=1;j<3;j++)
                    a[i].sum += a[i].s[j]*300/(double)Max[j]*0.25;
                for(int j=3;j<5;j++)
                    a[i].sum += a[i].s[j]*300/(double)Max[j]*0.5;
     
            }
            sort(a,a+n,cmp);
     
            for(int i=0;i<n;i++)
            {
                cout<<a[i].name;
                printf(" %.5f
    ",a[i].sum);
            }
        }
    }
    

      

     
  • 相关阅读:
    rabbitMQ学习笔记(二) 简单的发送与接收消息 HelloWorld
    rabbitMQ学习笔记(一)Windows 与Linux下rabbitMQ的安装
    数据库必知必会操作手册—创建高级联结
    面试题 16.11. 跳水板(数学法)
    面试题 08.06. 汉诺塔问题(分治递归)
    剑指 Offer 32
    剑指 Offer 32
    剑指 Offer 53
    剑指 Offer 30. 包含min函数的栈(辅助栈)
    剑指 Offer 58
  • 原文地址:https://www.cnblogs.com/Roni-i/p/9038960.html
Copyright © 2011-2022 走看看