排序基础题一
(2019-01-23 14:49:12)分类: 排序 |
一)openjudge谁考了第k名
在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求考第k名学生的学号和成绩。
输入
第一行有两个整数,分别是学生的人数n(1≤n≤100),和求第k名学生的k(1≤k≤n)。
其后有n行数据,每行包括一个学号(整数)和一个成绩(浮点数),中间用一个空格分隔。
输出
输出第k名学生的学号和成绩,中间用空格分隔。(注:请用%g输出成绩)
样例输入
5 3
90788001
67.8
90788002
90.3
90788003
61
90788004
68.4
90788005
73.9
样例输出
90788004
68.4
using namespace std;
struct student
{
float
score;
string
name;
}a[100];
int n,k;
int score_comp(const student &a,const student &b)
{
return
(a.score > b.score) || (a.score==b.score && a.name <
b.name);
}
int main()
{
cin>>n>>k;
for(int
i=0;i
{
cin>>a[i].name;
cin>>a[i].score;
}
sort(a+0,a+n,score_comp);
int
i=k-1;
cout<<a[i].name<<"
"<<a[i].score<<endl;
return
0;
}
二)openjudge合影效果
小云和朋友们去爬香山,为美丽的景色所陶醉,想合影留念。如果他们站成一排,男生全部在左(从拍照者的角度),并按照从矮到高的顺序从左到右排,女生全部在右,并按照从高到矮的顺序从左到右排,请问他们合影的效果是什么样的(所有人的身高都不同)?
输入
第一行是人数n(2
<= n <= 40,且至少有1个男生和1个女生)。
后面紧跟n行,每行输入一个人的性别(男male或女female)和身高(浮点数,单位米),两个数据之间以空格分隔。
输出
n个浮点数,模拟站好队后,拍照者眼中从左到右每个人的身高。每个浮点数需保留到小数点后2位,相邻两个数之间用单个空格隔开。
样例输入
6
male
1.72
male
1.78
female
1.61
male
1.65
female
1.70
female
1.56
样例输出
1.65 1.72
1.78 1.70 1.61 1.56
using namespace std;
struct HM{
string
sex;
double
height;
}ps[101];
int cmp(HM a,HM b)
{
if(a.sex=="male" && b.sex=="female")
return 1;
if(a.sex=="male" && b.sex=="male") return
a.height < b.height;
if(a.sex=="female" && b.sex=="female")
return a.height > b.height;
return
0;
}
int main()
{
int
n;
cin>>n;
for(int
i=1;i<=n;i++)
cin>>ps[i].sex>>ps[i].height;
sort(ps+1,ps+n+1,cmp);
for(int
i=1;i<=n;i++)
printf("%0.2lf
",ps[i].height);
}
三)奖学金 NOIP2007复赛 普及组 第一题
某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。
任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分)
是:
7 279
5 279
这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是 279
(总分等于输入的语文、数学、英语三科成绩之和) ,但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是:
5 279
7 279
则按输出错误处理,不能得分。
输入
包含n+1行:
第1行为一个正整数n,表示该校参加评选的学生人数。
第2到n+1行,每行有3个用空格隔开的数字,每个数字都在0到100之间。第j行的3个数字依次表示学号为 j-1
的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为1~n (恰好是输入数据的行号减1)。
所给的数据都是正确的,不必检验。
50%的数据满足:各学生的总成绩各不相同;
100%的数据满足:
6<=n<=300。
输出
共有5行,每行是两个用空格隔开的正整数,依次表示前5名学生的学号和总分。
样例输入
样例 #1:
6
90 67
80
87 66
91
78 89
91
88 99
77
输入
输出
样例输入
样例输出
using namespace std;
struct student
{
}a[100];
int n,k;
int score_comp(const student &a,const student &b)
{
}
int main()
{
}
二)openjudge合影效果
输入
输出
样例输入
样例输出
using namespace std;
struct HM{
int cmp(HM a,HM b)
{
int main()
{
}
三)奖学金 NOIP2007复赛 普及组 第一题
输入
输出
样例输入