• ACM基础之结构体排序


    问题 E: 【排序】排名

    时间限制: 1 Sec  内存限制: 64 MB


    题目描述

    班上刚测试了几门课,现在信息技术课的老师要分析一些功课之间的成绩关系,看看每个人的信息技术课成绩排名以及数学课成绩排名,并按信息技术课的成绩从高到低排列,如果两个人的信息技术课成绩相同,则学号小的排在前面。老师把任务交给了信息学最好的你,请你编程完成这个任务。

    输入

    第1行一个整数N,表示共有N个同学的成绩(1≤N≤45);后面有N行,每行4个整数,分别表示一个同学的:语文、数学、英语、信息技术成绩(成绩C:0≤C≤120)。

    输出

    共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 97 103 92 3 2


    先上代码(C++):

    #include <iostream>
    #include <bits/stdc++.h>
    using namespace std;
    struct stu
    {
    int ch,ma,en,co;//语文 数学 外语 信息成绩。
    int mr;//数学排名。
    int id;//学号。
    };
    int cmp(stu a,stu b)
    {
    if(a.ma==b.ma)
    {
    return a.id<b.id;
    }
    else
    {
    return a.ma>b.ma;
    }
    }
    int cmp1(stu a,stu b)
    {
    if(a.co==b.co)
    {
    return a.id<b.id;
    }
    else
    {
    return a.co>b.co;
    }
    }
    int main()
    {
    int n;
    cin>>n;
    stu s[n+5];
    for(int i=0;i<n;i++)
    {
    cin>>s[i].ch>>s[i].ma>>s[i].en>>s[i].co;
    s[i].id=i+1;
    }
    sort(s,s+n,cmp);
    for(int i=0;i<n;i++)
    {
    s[i].mr=i+1;
    }
    sort(s,s+n,cmp1);
    for(int i=0;i<n;i++)
    {
    printf("%d %d %d %d %d %d ",s[i].ch,s[i].ma,s[i].en,s[i].co,i+1,s[i].mr);
    }
    return 0;
    }

    思路:

    此问题明显考察的结构体排序,首先重写排序算法sort,cmp,对结构体里的“数学”元素ma进行排序,然后对结构体中的数学排名mr进行赋值。然后再次重写排序cmp1.为了省事,不对信息co进行赋予排名,直接输出i+1,

    注意:

    重写结构体时候不能漏掉“若成绩相同时候按照学号排序”此点,故重写时候进行简单的if判定。

    PS:菜鸟一个,大一放弃过ACM,现在在俱乐部与新生一起划水。



  • 相关阅读:
    封装( 增删改 查 )类
    php注释规范
    php访问mysql数据库
    php 文件限速下载代码
    jQuery鼠标事件汇总
    权限管理
    文件管理 打开-返回上级
    文件操作
    简单的文件上传
    ajax XML
  • 原文地址:https://www.cnblogs.com/shdwin/p/10200633.html
Copyright © 2020-2023  润新知