链接:https://www.nowcoder.com/acm/contest/83/B
来源:牛客网
时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
空间限制: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高的人的名字以及他的作文得分,代表作文得分的小数必须和输入一模一样,也就是原本末尾有多少零,输出也要有相同数量的零。 若分数相同,则名字字典序比较小的放在前面。
示例1
输入
3 Amy 8.999999999999999999999999999999999999999990000 Bob 8.9999999999999999999999999999999999999999800 Cat 8.9999999999999999999999999999999999999999899999999
输出
Amy 8.999999999999999999999999999999999999999990000 Cat 8.9999999999999999999999999999999999999999899999999 Bob 8.9999999999999999999999999999999999999999800
示例2
输入
6 Aa1 3. Bb2 2. Cc3 1. a 5. A 5.0 9 5.00
输出
9 5.00 A 5.0 a 5. Aa1 3. Bb2 2. Cc3 1.
说明
请仔细观察这样例输入中的最后三行,虽然小数部分末尾0的数目不一样,但他们三个人都是同分的,所以必须按照名字字典序输出。
示例3
输入
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
输出
coquelicot 9.999999999000000000 kelvin 9.9999999990 seanwu 9.999999999 shik 9.999999999 pp5438 5.438 l521530 5.21530 tmt514 5.140 peter50216 5.0216 csferng1021 1.021 dreamoon 0.00000000
说明
此样例上出现的这些 id 是代表台湾大学参加 2010~2014 年五届 ICPC World Final 的选手唷!当中只有废物 dreamoon 没在 World Final 拿过金牌~
备注:
2≤N≤2×105 1≤字串名称的长度≤11 namei由数字及大小写英文字母组成 若i≠j,则namei≠namej 所有名称的长度总和≤6×105 scorei包含三个部分:整数部分,小数点,小数部分 整数部分一定恰只有一个字元(数字'0'〜'9'之一) 一定有小数点('.') 小数部分由'0'〜'9'组成,长度可为0,也可以由字元'0'结尾 若把scorei视为字符串,所有scorei的长度总和≤6×105
0去掉;
下面附上我的代码:
#include<bits/stdc++.h>
using namespace std;
struct node{
string name;
string score;
string xscore;
}s[200005];
inline bool cmp(node A,node B){
if(A.xscore==B.xscore)
return A.name<B.name;
return A.xscore>B.xscore;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>s[i].name>>s[i].score;
int j=s[i].score.size()-1;
for(int k=s[i].score.size()-1;k>=1;k--)
{
if(s[i].score[k]!='0')
{
j=k;
break;
}
}
s[i].xscore=s[i].score.substr(0,j+1);
}
sort(s,s+n,cmp);
for(int i=0;i<n;i++)
cout<<s[i].name<<" "<<s[i].score<<endl;
return 0;
}