加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

排序基础题一

(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
    67 89 64
    78 89 98
    样例 #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
样例输出
    样例 #1:
    6 265
    4 264
    3 258
    2 244
    1 237
    样例 #2:
    8 265
    2 264
    6 264
    1 258
    5 258
using namespace std;
struct member{
    int id;
    int ch;
    int s;
    int eng;
    int total;
    };
int comp(const member &a,const member &b){
        if(
        (a.total < b.total)
        || (a.total == b.total && a.ch < b.ch)
        || ((a.total == b.total  && a.ch == b.ch) && a.id > b.id)
        )
        return 0;
        else return 1;
    }
member b[10001];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        b[i].id    =i;
        cin>>b[i].ch>>b[i].s>>b[i].eng;
        b[i].total    =b[i].ch+b[i].s+b[i].eng;
        }
    sort(b+1,b+n+1,comp);
    for(int i=1;i<=5;i++){
        cout<<b[i].id<<" "<<b[i].total<<endl;
        }

  

四)输出前k大的数
    给定一个数组,统计前k大的数并且把这k个数从大到小输出。
输入
    第一行包含一个整数n,表示数组的大小。n < 100000。
    第二行包含n个整数,表示数组的元素,整数之间以一个空格分开。每个整数的绝对值不超过100000000。
    第三行包含一个整数k。k < n。
输出
    从大到小输出前k大的数,每个数一行。
样例输入
    10
    4 5 6 9 8 7 1 2 3 0
    5
样例输出
    9
    8
    7
    6
    5

五)明明的随机数
    明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。
输入
    有2行,第1行为1个正整数,表示所生成的随机数的个数:N;
    第2行有N个用空格隔开的正整数,为所产生的随机数。
输出
    也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。
样例输入
    10
    20 40 32 67 40 20 89 300 400 15
样例输出
    8
    15 20 32 40 67 89 300 400
来源    NOIP2006复赛 普及组 第一题

六)车厢重组
在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转。一个车站的职工发现桥的长度最多能容纳两节车厢,
如果将桥旋转180度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车厢的顺序。于是他就负责用这座桥将进站的车
厢按车厢号从小到大排列。他退休后,火车站决定将这一工作自动化,其中一项重要的工作是编一个程序,输入初始的车厢顺序,
计算最少用多少步就能将车厢排序。
输入
输入文件有两行数据,第一行是车厢总数N(不大于10000),第二行是N个不同的数表示初始的车厢顺序。
输出
一个数据,最小的旋转次数
样例输入
4
4 3 2 1
样例输出
6

七)输出第k个数
读入n个数,输出第k个
输入
第一行:一个整数n(1<=n<=100)
第二行:n个整数
第三行:一个整数k(1<=k<=n)
输出
输出第二行中的第k个数
样例输入
5
5 4 3 2 1
2
样例输出
4

八)求逆序对
给定一个序列a1,a2,a3,……,an,如果存在iaj,那么我们称之为逆序对,求给定序列中逆序对的数目。
输入
第一行为n,表示序列的长度,接下来的n行,第i+1行表示序列的第i个数。
输出
所有逆序对的总数
样例输入
4
3
2
3
2
样例输出
3
提示
n<=105,ai<=105
n在10个点的数据范围:5, 10, 100, 500, 1000, 5000, 10000, 30000, 50000, 70000, 100000

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有