已知 n 位同学的考试成绩,按成绩从高到低排序,成绩相同时,按照学号从小到大排序。(学号为输入时的下标序号)

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

struct node{
	int grade,id;
	bool operator<(const node &r)const{
		if(grade==r.grade) return id<r.id;//若成绩一样则按学号从小到大排序 
		else return grade>r.grade;
	}
};
node a[10];
int main(void){
	int n;
	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i].grade;
	sort(a,a+n);
	for(int i=0;i<n;i++) cout<<a[i].id<<" "<<a[i].grade<<endl;
	return 0;
}

手写排序

bool cmp(node p,node q){
	if(p.x!=q.x){
		return p.x<q.x;
	}else{
		return p.y<q.y;
	}
}
//调用:sort(a,a+n,cmp);

样例输入 #1

3
90
70
100

样例输出 #1

3 100
1 90
2 70

样例输入 #2

5
100
66
100
90
100

样例输出 #2

1 100
3 100
5 100
4 90
2 66

P1093 [NOIP2007 普及组] 奖学金

题目描述

某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前 55 名学生发奖学金。期末,每个学生都有 33 门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面,这样,每个学生的排序是唯一确定的。

任务:先根据输入的 33 门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。注意,在前 55 名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是:

77 279279 55 279279

这两行数据的含义是:总分最高的两个同学的学号依次是 77 号、55 号。这两名同学的总分都是 279279 (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为 77 的学生语文成绩更高一些。如果你的前两名的输出数据是:

55 279279 77 279279

则按输出错误处理,不能得分。

输入格式

n+1n+1行。

11 行为一个正整数n(300)n ( \le 300),表示该校参加评选的学生人数。

22n+1n+1 行,每行有 33 个用空格隔开的数字,每个数字都在 00100100 之间。第 jj 行的 33 个数字依次表示学号为 j1j-1 的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为 1n1\sim n(恰好是输入数据的行号减 11)。

所给的数据都是正确的,不必检验。

输出格式

55 行,每行是两个用空格隔开的正整数,依次表示前 55 名学生的学号和总分。

样例 #1

样例输入 #1

6
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98

样例输出 #1

6 265
4 264
3 258
2 244
1 237

样例 #2

样例输入 #2

8
80 89 89
88 98 78
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98

样例输出 #2

8 265
2 264
6 264
1 258
5 258

样例输入 #3

110
79 36 64
30 74 75
33 80 43
65 61 41
37 40 53
74 63 53
48 69 34
87 31 83
60 57 56
52 92 36
80 68 34
73 92 37
62 80 48
54 84 63
73 40 39
73 31 61
44 52 79
54 54 94
90 94 86
31 89 64
32 40 83
94 50 80
45 73 58
58 92 95
82 68 94
69 69 87
66 71 68
79 41 62
75 36 59
41 34 62
98 73 71
33 95 87
38 57 76
48 70 67
78 68 41
78 77 71
31 43 91
46 44 77
55 91 49
67 47 84
43 51 42
78 92 37
71 61 43
95 68 48
67 81 32
48 33 39
57 31 66
92 84 72
84 75 47
37 98 49
68 86 64
60 32 44
74 58 81
33 35 96
57 57 45
58 97 44
51 60 82
35 64 94
66 95 83
55 92 40
94 37 45
91 53 32
49 45 98
85 32 91
45 51 88
96 99 81
43 64 81
57 67 72
83 31 39
66 72 87
66 72 76
72 85 74
98 68 85
49 60 94
85 45 30
39 76 83
73 76 35
53 34 36
81 94 70
80 46 76
71 52 65
68 40 37
60 84 71
80 74 65
96 44 30
59 79 91
91 42 48
98 82 90
94 94 63
93 70 54
39 78 98
59 57 72
84 84 99
33 48 68
31 67 91
91 49 88
63 47 69
37 64 41
65 63 88
66 32 96
86 98 86
30 90 98
92 96 51
65 97 42
97 54 51
66 98 92
95 88 60
45 31 97
51 68 33
51 46 88

样例输出 #3

66 276
88 270
19 270
101 270
93 267
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

struct node{
	int Chinese,maths,English,total,id;
	bool operator<(const node &r){
		if(total!=r.total) return total>r.total;
		else{
			if(Chinese!=r.Chinese) return Chinese>r.Chinese;
			else return id<r.id;
		}
	}
};
node a[305];
int main(void){
	int n;
	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i].Chinese>>a[i].maths>>a[i].English,a[i].id=i+1;
	for(int i=0;i<n;i++) a[i].total=a[i].Chinese+a[i].maths+a[i].English;
	sort(a,a+n);
	for(int i=0;i<5;i++) cout<<a[i].id<<" "<<a[i].total<<endl;
	return 0;
}

一开始定义了5个数组

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

struct node{
	int id,c,m,e,t;
};
bool cmp(node s1,node s2){
	if(s1.t!=s2.t) return s1.t>s2.t;
	else{
		if(s1.c!=s2.c) return s1.c>s2.c;
		else return s1.id<s2.id;
	}
}
node a[305];
int main(void){
	int n;
	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i].c>>a[i].m>>a[i].e,a[i].id=i+1;
	for(int i=0;i<n;i++) a[i].t=a[i].c+a[i].m+a[i].e;
	sort(a,a+n,cmp);
	for(int i=0;i<5;i++) cout<<a[i].id<<" "<<a[i].t<<endl;
	return 0;
}