沃老师学生的成绩
链接:https://www.nowcoder.com/acm/contest/83/B
来源:牛客网
题目描述
第一次期中考终于结束啦!沃老师是个语文老师,他在评学生的作文成绩时,给每位学生的分数都是一个小于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.
用sort,但排序之前需要把后置0去掉在比较,输出的时候就要原样输出了。有一点需要注意,用自定义sort时,需要用引用,不然会超时。具体是不使用引用相当于把字符串复制一遍了。
#include <iostream> #include <stdio.h> #include <algorithm> #include <cstring> #define ll long long using namespace std; const int N = 2e5+10; char str[N]; struct Nod { string s, ss; string sss; }nod[N]; inline bool cmp(Nod a, Nod b) { if(a.sss != b.sss) return a.sss > b.sss; else return a.s < b.s; } int main() { ios::sync_with_stdio(false); int n; cin >> n; for(int i = 0; i < n; i ++) { cin >> nod[i].s >> nod[i].ss; int len = nod[i].ss.length()-1; while(nod[i].ss[len] == '0') len--; nod[i].sss = nod[i].ss.substr(0,len+1); } sort(nod,nod+n,cmp); for(int i = 0; i < n; i ++) { cout << nod[i].s << ' ' << nod[i].ss << endl; } return 0; }