Skip to content

14078: 【原4078】成绩表里找同学

题目

题目描述

author: 程序设计思想与方法助教组 Hao Xiong 原OJ链接:https://acm.sjtu.edu.cn/OnlineJudge-old/problem/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

ligongzzz's solution

#include "iostream"
#include "cstring"

using namespace std;

constexpr auto maxNum = 100;

//交换
template <class T>
void mySwap(T&a, T &b) {
    T temp = a;
    a = b;
    b = temp;
}

//冒泡排序
//(bool为真表示a>b,true代表升序)
template <class T>
void bubbleSort(T *destination, T *source, int num, bool(*f)(T a, T b),bool mode) {
    //复制
    if (destination != source)
        for (int i = 0; i < num; i++)
            destination[i] = source[i];

    for (int i = num - 2; i >= 0; i--)
        for (int j = 0; j <= i; j++)
            if ((f(destination[j], destination[j + 1])&&mode)|| (!f(destination[j], destination[j + 1]) && !mode))
                mySwap(destination[j], destination[j + 1]);
}

class student {
public:
    int chinese, math, english;
    char name[maxNum];

    student() =default;

    /*student(const student &stu) {
        strcpy(name, stu.name);
        chinese = stu.chinese;
        math = stu.math;
        english = stu.english;
    }*/

};

int main() {
    int n, k;
    char name[maxNum];
    cin >> n;
    student *stu = new student[n];
    for (int i = 0; i < n; i++) {
        cin >> stu[i].name;
        cin >> stu[i].chinese;
        cin >> stu[i].math;
        cin >> stu[i].english;
    }
    cin >> k;
    k--;

    //开始排序
    bubbleSort<student>(stu, stu, n, [](student stu1,student stu2) {
        int sum1 = stu1.chinese+stu1.math+stu1.english, sum2 = stu2.chinese+stu2.math+stu2.english;
        if (sum1 > sum2)
            return true;
        else if (sum1 < sum2)
            return false;
        else if (stu1.chinese > stu2.chinese)
            return true;
        else if (stu1.chinese < stu2.chinese)
            return false;
        else if (stu1.math > stu2.math)
            return true;
        else if (stu1.math < stu2.math)
            return false;
        else if (stu1.english > stu2.english)
            return true;
        else if (stu1.english < stu2.english)
            return false;
        else if (strcmp(stu1.name,stu2.name)<0)
            return true;
        else if (strcmp(stu1.name, stu2.name)>0)
            return false;

        return true;
    },false);

    //输出
    cout << stu[k].name << " " << stu[k].chinese + stu[k].math + stu[k].english;

    return 0;
}