沃老师学生的成绩

链接: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;
}

  

原文地址:https://www.cnblogs.com/xingkongyihao/p/8824293.html