zoukankan      html  css  js  c++  java
  • 结构体排序教学

    排名
    宁波市的小学生们在镇海中学完成程序设计比赛后,老师们批出了所有学生的成绩,成绩按分数从高到低排名,成
    绩相同按年级从低到高排(注:纯属虚构,请勿对号入座)。现在主办单位想知道每一个排名的学生前,有几位学
    生的年级低于他(她)。
    输入
    有若干行:
    第1行只有一个正整数n(1≤n≤200),表示参赛的学生人数。
    第2行至第n+1行共n行,每行有两个正整数s(0≤s≤400),g(1≤g≤6)。
    其中第i+1行的第一个数s表示第i个学生的成绩,第i+1行的第二个数g表示第i个学生的年级。
    输出
    有n行,每行只有一个正整数
    其中第i行的数k表示排第i名的学生前面有k个学生排名比他(她)高,且年级比他(她)低。
    样例输入
    23
    250 4
    220 2
    20 4
    290 2
    370 6
    210 2
    360 1
    180 1
    200 2
    170 3
    50 6
    300 6
    150 1
    400 6
    90 2
    390 6
    100 2
    380 5
    350 2
    310 4
    40 6
    0 6
    320 3
    样例输出
    0
    0
    0
    1
    0
    1
    2
    3
    5
    1
    4
    1
    1
    1
    0
    7
    0
    3
    3
    15
    15
    12
    16

    Sol:多关键字排序

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    struct cj{
        int nianji;
        int chengji;
       // int wz;
    };
    bool cmp(cj a,cj b)
    {
        if(a.chengji>b.chengji)
        return 1;
        if(a.chengji<b.chengji)
        return 0;
        if(a.nianji<b.nianji)
        return 1;
        else
        return 0;
    }
    cj a[210];
    int v[210];
    int main()
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i].chengji>>a[i].nianji;
            //a[i].wz=i;
        }
        sort(a+1,a+1+n,cmp);
        for(int i=1;i<=n;i++)
        {
            int sum=0;
            for(int j=1;j<i;j++)
            //经过排序后,在i前面的均是成绩高于i的 
            if(a[i].nianji>a[j].nianji)
                sum++;
            v[i]=sum;
        }
        for(int i=1;i<=n;i++)
            cout<<v[i]<<endl;
        return 0;
    }
    

      

    排名
    时间限制 : 1.000 sec 内存限制 : 128 MB
    题目描述
    班上刚测试了几门课,现在信息技术老师要分析一些功课之间的成绩关系,看看每个人的信息技术课排名以及他的
    数学排名,并按信息技术课的成绩从高分到低分排列(数据中保证任意一学科中没有两个人的这门课成绩是一样的
    )。老师把任务交给了信息学最好的你,请你编程完成这个任务。
    输入
    第一行一个整数N,表示共有N个同学的成绩。
    后面有N行,每行4个整数,分别表示一个同学的:语文、数学、英语、信息技术成绩。
    输出
    共N行,每行6个数据,分别对应一个同学的:语文、数学、英语、信息技术成绩和信息技术及数学的排名。

    样例输入
    3
    90 95 89 110
    95 120 78 115
    96 97 103 92
    样例输出
    95 120 78 115 1 1
    90 95 89 110 2 3
    96 87 103 92 3 2

    Sol:应该先讲这个,单关键字排序

    #include<bits/stdc++.h>
    using namespace std;
    struct data{
        int chinese,math,english,it,mathn,itn,number;
    }a[100000];
    bool cmp1(data x,data y){
        return x.math>y.math;
    }
    bool cmp2(data x,data y){
        return x.it>y.it;
    }
    int main()
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i].chinese>>a[i].math>>a[i].english>>a[i].it;
            a[i].number=i;
        }
        sort(a+1,a+n+1,cmp1); //先按数学成绩排序 
        for(int i=1;i<=n;i++)
             a[i].mathn=i;
        sort(a+1,a+n+1,cmp2); //再接信息技术成绩排名 
        for(int i=1;i<=n;i++)
        {
            cout<<a[i].chinese<<' '<<a[i].math<<' '<<a[i].english<<' '<<a[i].it;
            cout<<' '<<i<<' '<<a[i].mathn<<endl;
        }
        return 0;
    }
    

      

    高校录取
    [命题人 : 外部导入]
    时间限制 : 1.000 sec 内存限制 : 128 MB

    题目描述
    高三全省联合模拟考试刚刚结束,经过各科老师的努力,各个学科的改卷工作终于结束了,每位同学的各科分数也
    已经结算完毕。此时,老师们开始模拟各个高校录取情况。每个大学有自己的录取范围。例如,清华、北大招生约
    为理科全省前100名,复旦、上海交大在全省理科101至300名。老师们想要知道哪些同学可以进入某个名校。可是
    ,统计软件突然失灵,查询和比对工作也无法进行,只有事先已经得到的理科每位同学的各科成绩。现在请你帮助
    老师编写一个程序,显示出可以进入某高校的名单。此次考试理科排名规则:
    1.按照语文、数学、外语、理科综合四门科目总分由高到低排名;
    2.若总分相同,则按照数学成绩由高到低排名;
    3.若总分和数学成绩都相同,按照理科综合成绩由高到低排名;
    4.若总分、数学、理科综合都相同,按照语文成绩由高到低排名;
    5.若总分、数学、理科综合、语文成绩都相同,则按照报名序号从小到大排序(这里报名序号为输入顺序,第1个
    输入就是1号,第100个输入就是100号)。
    输入
    第一行三个整数n,a和b,分别表示参加考试的人数和某高校的录取名次范围(从名次a到名次b)。
    接下来n行,每行4个整数,表示每位同学的每门学科的成绩。依次为语文、数学、英语、综合。成绩0<=x<=300。
    1<=a<=b<=n<=100000
    输出
    输出b-a+1行,排名在a~b名的同学信息。
    每行两个整数,分别为报名序号和总分(报名序号看题目描述),中间用空格分开。
    样例输入 Copy
    6 3 5
    118 139 130 286
    105 130 129 296
    113 138 123 291
    104 133 119 283
    89 139 116 287
    103 127 118 288
    样例输出 Copy
    2 660
    4 639
    6 636
    //【样例1解释】
    排序后由高到低
    序号 总分

    1 118 139 130 286 673

    3 113 138 123 291 665

    2 105 130 129 296 660

    4 104 133 119 283 639

    6 103 127 118 288 636

    5 89 139 116 287 631
    输出3~5名的序号和总分

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    #include<vector>
    using namespace std;
    struct node
    {
        int chinese;
        int math;
        int english;
        int other;
        int sum;
        int number;
    }people[100001];
    bool cmp(node a,node b)
    {
        if(a.sum>b.sum)return 1;
        if(a.sum<b.sum)return 0;
        if(a.sum==b.sum)
        {
            if(a.math>b.math)return 1;
            if(a.math<b.math)return 0;
            if(a.math==b.math)
            {
                if(a.other>b.other)return 1;
                if(a.other<b.other)return 0;
                if(a.other==b.other)
                {
                    if(a.chinese>b.chinese)return 1;
                    if(a.chinese<b.chinese)return 0;
                    if(a.chinese==b.chinese)
                    {
                        if(a.number<b.number)return 1;
                        if(a.number>b.number)return 0;
                    }
                }
            }
        }
    }
    int main()
    {
        int n,a,b;cin>>n>>a>>b;
        for(int i=1;i<=n;i++)
        {
            people[i].number=i;
            cin>>people[i].chinese>>people[i].math>>people[i].english>>people[i].other;
            people[i].sum=people[i].chinese+people[i].math+people[i].english+people[i].other;
        }
        sort(people+1,people+n+1,cmp);
        for(int i=a;i<=b;i++)
        {
            cout<<people[i].number<<" "<<people[i].sum<<endl;
        } 
        return 0;
    }
    

      

  • 相关阅读:
    ajax 检测用户名是否可用
    Ajax 知识
    flask 基础
    如何使Session永不过期
    Css 截取字符串长度
    json sort
    js 原生获取Class元素
    js 跳转整理
    html5 ajax Java接口 上传图片
    调用URL 接口服务
  • 原文地址:https://www.cnblogs.com/cutemush/p/13679986.html
Copyright © 2011-2022 走看看