4078. 成绩表里找同学

问题描述

编写一个程序,读入 N 个同学的姓名和语数外三门功课的单科成绩,对其按照一定的排序规则排序形成一张成绩表(先按总分从高到低排序,总分相同则按语文成绩由高到低排序,仍然相同则按数学成绩由高到低排序,若总分和单科成绩均相同则最后按姓名的字典序排序)。最后给定一个数字 K(K<=N) ,输出在这张排好序的成绩表中位置在第 K 位的同学的姓名和总分。

字典序举例说明:

abc > abd
a > aa

输入输出描述

输入

  • 第一行输入一个正整数 N(1<=N<=1024),代表接下来将录入 N 个学生的成绩。
  • 接下来 N 行录入 N 条学生的成绩记录,每条记录依次为姓名,语文成绩,数学成绩,英语成绩,这四个字段以空格分隔。姓名为字符串(仅包含小写字母,不含空格,长度<=19),学生之间不会重名。三科成绩均为整数(0~100)。
  • 最后输入一个正整数 K(1<=K<=N),代表需要在成绩表中从前往后找到的位置。

输出

  • 在成绩表中从前往后处在第 K 位的同学的姓名和总分,中间以空格分隔。

程序运行示例1

Sample Input 1
2
tom 90 91 92
lucy 91 90 92
1
Sample Output 1
lucy 273

程序运行示例2

Sample Input 2
4
lily 90 100 88
jack 87 79 95
hanz 90 89 71
david 90 89 71
4
Sample Output 2
hanz 250



#include<algorithm>
#include<iostream>
using namespace std;

struct student{
    string name;
    int chinese;
    int math;
    int english;
};

student s[1025];

bool compare(student a,student b){
    if(a.chinese+a.english+a.math!=b.english+b.chinese+b.math){
        return a.chinese+a.english+a.math>b.english+b.chinese+b.math;
    }else{
        if(a.chinese!=b.chinese){
            return a.chinese>b.chinese;
        }else{
            if(a.math!=b.math){
                return a.math>b.math;
            }else{
                if(a.english!=b.english){
                    return a.english>b.english;
                }else{
                    return a.name<b.name;
                }
            }
        }
    }
}

int main(){
    int n;
    //freopen("input.txt","r",stdin);
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>s[i].name>>s[i].chinese>>s[i].math>>s[i].english;    
    }
    sort(s,s+n,compare);
    int k;
    cin>>k;
    cout<<s[k-1].name<<" "<<s[k-1].chinese+s[k-1].english+s[k-1].math;
    return 0;
} 

 

转载于:https://www.cnblogs.com/bernieloveslife/p/7911751.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值