18107 校赛排名

18107 校赛排名

时间限制:4000MS  内存限制:65535K
提交次数:0 通过次数:0

题型: 编程题   语言: G++;GCC;VC

 

Description

校赛结束了,每一个参赛选手由3个数据项构成(通过题数,用时分钟数,姓名),排名按照通过题数排序
通过题数多的排前,同题数的,罚时少的排前。如果题数相同,罚时也相同,而按数据读取的先后排。
给你N个参赛选手的数据,按排序先后,输出姓名




输入格式

第一个数为N,(N<=500000)
此后,每行一个参赛选手的数据,通过题数,用时分钟数,姓名,前两者为整型数,姓名为字符串(不多于20个字符)



输出格式

姓名排名



 

输入样例

4
3 5 Jon
5 100 Smith
3 5 Tom
6 95 Hel



 

输出样例

Hel
Smith
Jon
Tom



 

提示

由于有500000个数据,输入和输出务必使用scanf和printf



 

作者

 admin

    就用了个sort()的水题;唯一要注意的坑就是题目要求题数和时间都相同的时候是要按输入的顺序输出的,,所以给sort()写比较子的时候要注意得是稳定排序才可以;我这里是直接用了stable_sort()就过了;当然,也可以用另一个技巧:每输入一个人的数据,令time*n-i;这样一来就不会存在有题数相同的同时又时间相同的情况了。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <cctype>
 6 #include <cmath>
 7 #include <algorithm>
 8 #include <set>
 9 #include <map>
10 #include <queue>
11 #include <stack>
12 #include <utility>
13 #include <vector>
14 #define ll long long
15 #define inf 0x3f3f3f3f
16 #define MAXN 500000
17 using namespace std;
18 
19 typedef struct node
20 {
21     int solve,time;
22     char name[21];
23 }node;
24 node a[MAXN+5];
25 bool cmp(node a,node b)
26 {
27     if(a.solve!=b.solve)
28         return a.solve>b.solve;
29     else
30         return a.time<b.time;
31 }
32 int main()
33 {
34     //freopen("input.txt","r",stdin);
35     int n;
36     scanf("%d",&n);
37     for(int i=0;i<n;i++)
38         scanf("%d%d%s",&a[i].solve,&a[i].time,a[i].name);
39     stable_sort(a,a+n,cmp);
40     for(int i=0;i<n;i++)
41         printf("%s
",a[i].name);
42     return 0;
43 }
原文地址:https://www.cnblogs.com/geek1116/p/5548778.html