沃老师学生的成绩

题目链接:点击打开链接

链接:https://www.nowcoder.com/acm/contest/83/B
来源:牛客网

时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

第一次期中考终于结束啦!沃老师是个语文老师,他在评学生的作文成绩时,给每位学生的分数都是一个小于10的非负小数。

Amy 8.999999999999999999999999999999999999999990000

Bob 8.9999999999999999999999999999999999999999800

Cat 8.9999999999999999999999999999999999999999899999999

沃老师并不会告诉大家分数的排名,但学生间竞争激烈,大家都想知道自己的作文成绩在班上的排名。
但由于作文分数的小数部分可能超级长,难以用肉眼比较两个数的大小关系,请你帮忙写个程序,把所有学生按照作文分数排序吧〜


输入描述:

输入共有N + 1行。
第一行有一个正整数N,代表班上有几个人。
接下来N行中的第i行,包含一个字符串namei,以及一个小数scorei,分别代表第i个人的名字以及第i个人的作文得分。

输出描述:

输出总共N行,每行由一个名字和一个小数构成,第i行代表着分数第i高的人的名字以及他的作文得分,代表作文得分的小数必须和输入一模一样,也就是原本末尾有多少零,输出也要有相同数量的零。
若分数相同,则名字字典序比较小的放在前面。

需要特别考虑的就是:同名又同分时,此时输出保持原来的循序,这就体现出了用stable_sort(num,num+n,cmp)的好处,用sort(num,num+n,cmp)总是通不过,这就是水平有限。带有stable的函数可保证想等元素的原本相对次序在排序后保持不变。或许你会问,既然想等,你还管他相对位置呐,也分不清楚谁是谁了?这里需要能清楚一个问题,这里的相等是指你提供的函数表示两个元素相等,并不一定是一摸一样的函数。

#include <iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;

struct node{

    string name;
    string score;
    string rscore;
}num[200005];

bool cmp(node a,node b)
{
    if(a.rscore==b.rscore)
    {
        return a.name<b.name;
    }
    else
    {
        return a.rscore>b.rscore;
    }
}
int main()
{
    int n;
    scanf("%d",&n);
    {
        for(int i=0;i<n;i++)
        {
            cin>>num[i].name>>num[i].score;
            int r=num[i].score.length()-1;
            for(int j=r;j>=0;j--)
            {
                if(num[i].score[j]=='0')
                {
                   r--;
                }
                else
                {
                    break;
                }
            }
            num[i].rscore=num[i].score.substr(0,r+1);

        }
        stable_sort(num,num+n,cmp);
        for(int i=0;i<n;i++)
        {
            cout<<num[i].name<<' '<<num[i].score<<endl;
        }
    }
    return 0;
}
/*
链接:https://www.nowcoder.com/acm/contest/83/B
来源:牛客网
链接:https://www.nowcoder.com/acm/contest/83/B
来源:牛客网

3
Amy 8.999999999999999999999999999999999999999990000
Bob 8.9999999999999999999999999999999999999999800
Cat 8.9999999999999999999999999999999999999999899999999
10
peter50216 5.0216
kelvin 9.9999999990
seanwu 9.999999999
pp5438 5.438
csferng1021 1.021
tmt514 5.140
dreamoon 0.00000000
shik 9.999999999
l521530 5.21530
coquelicot 9.999999999000000000
6
Aa1 3.
Bb2 2.
Cc3 1.
a 5.
A 5.0
9 5.00*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值