sort排序,再来一篇!

蒜头君班上一共有n个同学,每个同学依次编号为
1,2,…n,每个同学有一个分数。现在他请你帮
忙做一份全班同学的成绩排名表。
首先你需要按照分数从高到低将所有同学排序,再
输出成绩单上每个同学的编号。
保证任意两个同学的分数互不相同。
1

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct Student {
    int score;
    int id;
};
Student stu[105];
bool cmp(Student a, Student b) {
    return a.score > b.score;
}
int main() {
    int n;
    scanf_s("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf_s("%d", &stu[i].score);
        stu[i].id = i + 1;
    }
    sort(stu, stu + n, cmp);
    for (int i = 0; i < n; i++) {
        if (i == 0)
            printf("%d", stu[i].id);
        else
            printf(" %d", stu[i].id);
    }
    return 0;
}

结果如下:

输入:
5
97
68
51
85
73
输出:
1 4 5 2 3

小蒜所在的学校一开学就进行了一次摸底考试。摸
底考试考了语文、数学、英语、科学共四门课程。
小蒜的老师汇总成绩后列出了成绩单,其中包括每
个同学的姓名和四科的成绩。现在老师希望表扬一
下每门课程考试得分前四名和总分前四名的同学,
同分数的情况下,名字字典序更小的先表扬。
请你帮助老师写一个程序,快速完成这件事情吧。
输入格式:
第一行为学生人数N(4<= N ≤100)。
之后N行依次为每个学生的姓名和语文、数学、
英语、科学这四门课程的成绩,之间用一个空格隔
开(成绩都大于等于0小于等于100)
输出格式:
输出第一行为语文考试要表扬前四名的同学的姓
名,之间用一个空格隔开。
输出第二行为数学考试要表扬前四名的同学的姓
名,之间用一个空格隔开。
输出第三行为英语考试要表扬前四名的同学的姓
名,之间用一个空格隔开。
输出第四行为科学考试要表扬前四名的同学的姓
名,之间用一个空格隔开。
输出第五行为总分要表扬前四名的同学的姓名,之
间用一个空格隔开。

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct Student {
    char name[105];
    int score[4];
};
Student stu[105];
bool cmp1(Student a, Student b)
{
    if (a.score[0] != b.score[0])
    {
        return a.score[0] > b.score[0];
    }
    else
    {
        return strcmp(a.name, b.name) < 0;
    }  
}
bool cmp2(Student a, Student b)
{
    if (a.score[1] != b.score[1])
    {
        return a.score[1] > b.score[1];
    }
    else
    {
        return strcmp(a.name, b.name) < 0;
    }
}
bool cmp3(Student a, Student b)
{
    if (a.score[2] != b.score[2])
    {
        return a.score[2] > b.score[2];
    }
    else
    {
        return strcmp(a.name, b.name) < 0;
    }
}
bool cmp4(Student a, Student b)
{
    if (a.score[3] != b.score[3])
    {
        return a.score[3] > b.score[3];
    }
    else
    {
        return strcmp(a.name, b.name) < 0;
    }
}
bool cmp5(Student a, Student b)
{
    int suma = 0;
    int sumb = 0;
    for (int i = 0; i < 4; i++)
    {
        suma += a.score[i];
        sumb += b.score[i];
    }
    if (suma != sumb)
    {
        return suma>sumb;
    }
    else
    {
        return strcmp(a.name, b.name) < 0;
    }
}
void print()
{
    for (int i = 0; i < 3; i++)
    {
        printf("%s ", stu[i].name);
    }
    printf("%s\n", stu[3].name);
}
int main() {
    int n;
    scanf_s("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf_s("%s", &stu[i].name);
        for (int j = 0; j < 4; j++)
        {
            scanf_s("%d", &stu[i].score[j]);
        }
    }
    sort(stu, stu + n, cmp1);
    print();
    sort(stu, stu + n, cmp2);
    print(); 
    sort(stu, stu + n, cmp3);
    print();
    sort(stu, stu + n, cmp4);
    print();
    sort(stu, stu + n, cmp5);
    print();
    return 0;
}

结果展示:

输入:
5
alice 99 98 97 96
bob 98 97 96 94
coy 94 94 95 96
dan 93 95 96 97
evan 0 94 95 95
输出:
alice bob coy dan
alice bob dan coy
alice bob dan coy
dan alice coy evan
alice bob dan coy
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值