当前位置: 首页 > news >正文

【成绩排序,按原顺依次序输出名次,有相同名次】

有 n 名同学,每名同学有语文、数学、英语三科成绩,你需要按照如下规则对所有同学的成绩从高到低排序:

  1. 比较总分,高者靠前;
  2. 如果总分相同,则比较语文和数学两科的总分,高者靠前;
  3. 如果仍相同,则比较语文和数学两科的最高分,高者靠前;
  4. 如果仍相同,则二人并列。

你需要输出每位同学的排名,如遇 xx 人并列,则他们排名相同,并留空后面的 x−1x−1 个名次。例如,有 33 名同学并列第 11,则后一名同学自动成为第 44 名。

Input

第一行一个整数 NN,表示同学的人数。
接下来 NN 行,每行三个非负整数 ci,mi,eici​,mi​,ei​ 分别表示该名同学的语文、数学、英语成绩。

Output

输出 NN 行,按输入同学的顺序,输出他们的排名。
注意:请不要按排名输出同学的序号,而是按同学的顺序输出他们各自的排名。

Sample 1

InputcopyOutputcopy
6
140 140 150
140 149 140
148 141 140
141 148 140
145 145 139
0 0 0
1
3
4
4
2
6

思路:

1.先按照题目中条件依次写排序规则,名次一样是=时,return true;

2.排出名次后,按此顺序记录下各个同学的名次;

3.判断同名次时,再同时考虑三个因素,与前一个比较,如果三个条件都一样,名次与前一个同学一样;

4.因为要按原来的顺序输出名次,故要再拍一次序,按照原来的id号排;

5.最后再按照原来id循序依次输出名次

#include<bits/stdc++.h>
using namespace std;
struct stu{
    int a,b,c;
    int t,sum,s2,mx,id;
}st[10005];
bool cmp1(stu x,stu y)//按照题目中条件依次写排序规则
{
    if(x.sum!=y.sum)
        return x.sum>y.sum;

    else if(x.s2!=y.s2)
        return x.s2>y.s2;
    else if(x.mx!=y.mx)
        return x.mx>y.mx;
    else
        return true;//名次一样
}
bool cmp2(stu x,stu y)
{
    return x.id<y.id;//二次排序,使按照原来的顺序依次输出名次
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>st[i].a>>st[i].b>>st[i].c;
        st[i].id=i;
        st[i].sum=st[i].a+st[i].b+st[i].c;
        st[i].s2=st[i].a+st[i].b;
        st[i].mx=max(st[i].a,st[i].b);
    }
    sort(st,st+n,cmp1);
    st[0].t=1; //第一个名次肯定为1
    for(int i=1;i<n;i++)
    {
    //这里必须要考虑三个条件,只有三个条件都一样时名次才一样
        if((st[i].mx==st[i-1].mx)&&(st[i].sum==st[i-1].sum)&&(st[i].s2==st[i-1].s2))
        {
            st[i].t=st[i-1].t;
        }
        else
            st[i].t=i+1;//地址从0开始,故名次要加1
    }
    sort(st,st+n,cmp2);
    for(int i=0;i<n;i++)
    {
        cout<<st[i].t<<endl;
    }


    return 0;
}


文章转载自:

http://l0rNiAlN.Lwygd.cn
http://7MXUbdAq.Lwygd.cn
http://ZI1jfmgC.Lwygd.cn
http://J0mVKQhp.Lwygd.cn
http://GADe1XCT.Lwygd.cn
http://A3G7eaAY.Lwygd.cn
http://XrDIuMYv.Lwygd.cn
http://FeZ4bZcY.Lwygd.cn
http://c56zeGWF.Lwygd.cn
http://3dM0np7R.Lwygd.cn
http://sKMcWY4O.Lwygd.cn
http://naP4YkTO.Lwygd.cn
http://of9AtLsq.Lwygd.cn
http://DaP2lSfF.Lwygd.cn
http://IeLiwuG8.Lwygd.cn
http://2z18XhYs.Lwygd.cn
http://ZiQfnn2e.Lwygd.cn
http://cbbHYETj.Lwygd.cn
http://v8zbKoJC.Lwygd.cn
http://uHE33uPT.Lwygd.cn
http://1nNKlxM8.Lwygd.cn
http://qvZtQse6.Lwygd.cn
http://QV3BcIse.Lwygd.cn
http://2rgbc5zk.Lwygd.cn
http://OJJAZdih.Lwygd.cn
http://cQnVfoPV.Lwygd.cn
http://gpCxmnuZ.Lwygd.cn
http://SEXpBetj.Lwygd.cn
http://WeXIKNfz.Lwygd.cn
http://hT02e3wB.Lwygd.cn
http://www.dtcms.com/a/46019.html

相关文章:

  • CSDN博客写作教学(四):标题优化与SEO实战
  • I2C驱动(十一) -- gpio模拟的i2c总线驱动i2c-gpio.c分析
  • EdgeNext模型详解及代码复现
  • 开启AI短剧新纪元!SkyReels-V1/A1双剑合璧!昆仑万维开源首个面向AI短剧的视频生成模型
  • 李宏毅机器学习课程学习笔记04 | 浅谈机器学习-宝可梦、数码宝贝分类器
  • javaEE初阶————多线程初阶(5)
  • Unity 接入本地部署的DeepSeek
  • C语言复习4:有关数组的基础常见算法
  • C语言复习8:动态内存分配
  • 流程定义和流程实例
  • rk3568 sysrq如何使用快捷键
  • 题解 | 牛客周赛83 Java ABCDEF
  • 多Agent协作智能系统
  • Flutter系列教程之(9)——Flutter调用Android原生
  • 让自己如何快速有用一台华为云桌面。
  • 2025国家护网HVV高频面试题总结来了01(题目+回答)
  • C# dll文件的反编译获取源码
  • 【蓝桥】大小写转换
  • [含文档+PPT+源码等]精品基于Python实现的微信小程序的在线医疗咨询系统
  • 我们应该如何优化UI(基于UGUI)
  • 爬虫:PhantomJS的详细使用和实战案例
  • 【电力——tarjan割点,求连通块】
  • Leetcode132:分割回文串 II
  • 【领域】百度OCR识别
  • 请AI帮我们进行JAVA ORM 框架的选型, Hibernate, Mybatis, Bee,如何选择
  • 类和对象进一步了解c++
  • ​SMPP 协议在短信网关中的应用与迁移指南​附上文档地址(另外有个包内的方法,我使用的版本是又问题的,文章已经附上解决方式)
  • cellphonedb v5受配体多组比较气泡图(原创函数)
  • Ubuntu系统中测试硬盘速度
  • java作业