学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!
附上汇总贴:小猴编程C++ | 汇总-CSDN博客
【题目描述】
小猴举办了一场编程比赛——"小猴杯”,有
n
n
n名选手参加了比赛,赛后小猴邀请你对所有选手的比赛成绩进行分析,具体来说,你需要按照要求将比赛成绩从高到低的顺序或者从低到高的顺序进行排序。
对于成绩相同的选手,无论以那种顺序排序,都要按照原始成绩排列中靠前的选手排列在前的规则处理。例如,原始成绩排列中的两名选手的信息:
p
i
p
i
pipi
pipi、
300
300
300与
x
i
a
o
m
e
i
xiaomei
xiaomei、
300
300
300排序之前
p
i
p
i
pipi
pipi排在
x
i
a
o
m
e
i
xiaomei
xiaomei前面, 经过排序之后
p
i
p
i
pipi
pipi还是排在
x
i
a
o
m
e
i
xiaomei
xiaomei前面。
【输入】
第一行,包含两个正整数
n
n
n,表示参选手人数;
第二行,包含一个整数
0
0
0或
1
1
1,表示排序规则,
0
0
0表示从高到底,
1
1
1表示从低到高;
接下来
n
n
n行, 每行包含一个字符串
n
a
m
e
name
name和一个整数
s
c
o
r
e
score
score, 分别表示一名选手的姓名和比赛成绩, 保证姓名互不相同。
【输出】
n
n
n行,第
i
i
i行表示经过排序之后第
i
i
i名选手的姓名和比赛成绩。
【输入样例】
4
0
pipi 70
tx 96
Tom 70
xiaomei 67
【输出样例】
tx 96
pipi 70
Tom 70
xiaomei 67
【代码详解】
#include <bits/stdc++.h>
using namespace std;
struct play {
string name;
int score, id;
}a[200010];
bool cmp1(play a, play b)
{
if (a.score!=b.score) {
return a.score<b.score;
}
return a.id < b.id;
}
bool cmp2(play a, play b)
{
if (a.score!=b.score) {
return a.score>b.score;
}
return a.id < b.id;
}
int main()
{
int n, x;
cin >> n >> x;
for (int i=1; i<=n; i++) { // 输入n名选手的信息
cin >> a[i].name >> a[i].score; // 姓名和成绩
a[i].id = i; // 原始顺序就是i
}
if (x==1) { // 输入1就是从小到大排序
sort(a+1, a+n+1, cmp1);
} else { // 否则就是从大到小排序
sort(a+1, a+n+1, cmp2);
}
for (int i=1; i<=n; i++) { // 输出排序后的姓名和成绩
cout << a[i].name << " " << a[i].score << endl;
}
return 0;
}
【运行结果】
4
0
pipi 70
tx 96
Tom 70
xiaomei 67
tx 96
pipi 70
Tom 70
xiaomei 67