结构体排序教学

排名
宁波市的小学生们在镇海中学完成程序设计比赛后,老师们批出了所有学生的成绩,成绩按分数从高到低排名,成
绩相同按年级从低到高排(注:纯属虚构,请勿对号入座)。现在主办单位想知道每一个排名的学生前,有几位学
生的年级低于他(她)。
输入
有若干行:
第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;
}

  

posted @ 2020-09-16 16:47  我微笑不代表我快乐  阅读(383)  评论(0编辑  收藏  举报