列表

详情


NC15610. 沃老师学生的成绩

描述

第一次期中考终于结束啦!沃老师是个语文老师,他在评学生的作文成绩时,给每位学生的分数都是一个小于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 拿过金牌~

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 646ms, 内存消耗: 99408K, 提交时间: 2019-12-02 18:07:28

#include<bits/stdc++.h>
using namespace std;
struct strc
{
 string a,b,c;
}str[1024000];
bool cmp(strc &x,strc &y)
 {
  if(x.c==y.c)return x.a<y.a;
  return x.c>y.c;
 }
    
int main()
{
 int n;
 scanf("%d",&n);
 for(int i=0;i<n;i++)
 {
  cin>>str[i].a>>str[i].b;
  str[i].c=str[i].b;
  int l=str[i].c.length();
    while(str[i].c[l-1]=='0'){
        str[i].c.erase(str[i].c.end()-1);
        l--;
    }
 }
 sort(str,str+n,cmp);
 for(int i=0;i<n;i++)
  cout<<str[i].a<<' '<<str[i].b<<endl;
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 1941ms, 内存消耗: 22756K, 提交时间: 2018-04-27 01:56:51

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
struct student{
	string n,s,r;
}p[200000];
bool QOO(student a,student b){
	if(a.r==b.r)
		return a.n<b.n;
	return a.r>b.r;
}
int main(){
	int n,i;
	cin>>n;
	for(i=0;i<n;i++){
		cin>>p[i].n>>p[i].s;
		p[i].r=p[i].s.substr(0,p[i].s.find_last_not_of("0")+1);
	}
	sort(p,p+n,QOO);
	for(i=0;i<n;i++)
		cout<<p[i].n<<' '<<p[i].s<<'\n';
}

Python3 解法, 执行用时: 2669ms, 内存消耗: 82688K, 提交时间: 2023-04-27 21:34:15

from decimal import *
n = int(input())
arr = []
for i in range(n):
    name, num = input().split()
    arr.append((name, num, Decimal('-'+num)))
arr.sort(key=lambda x: (x[2], x[0]))
for t in arr:
    print(t[0], t[1])

Python(2.7.3) 解法, 执行用时: 1374ms, 内存消耗: 83552K, 提交时间: 2018-04-13 22:09:11

a = [[x, y, y.strip('0')] for x, y in [raw_input().split() for _ in xrange(input())]]
a.sort(key = lambda x: x[0])
a.sort(key = lambda x: x[2], reverse = True)
print '\n'.join([' '.join(_[:-1]) for _ in a])

上一题