PAT_A1028 | List Sorting

1028 List Sorting (25point(s))

Excel can sort records according to any column. Now you are supposed to imitate this function.

Input Specification:

Each input file contains one test case. For each case, the first line contains two integers N (≤10​5​​) and C, where N is the number of records and C is the column that you are supposed to sort the records with. Then N lines follow, each contains a record of a student. A student's record consists of his or her distinct ID (a 6-digit number), name (a string with no more than 8 characters without space), and grade (an integer between 0 and 100, inclusive).

Output Specification:

For each test case, output the sorting result in N lines. That is, if C = 1 then the records must be sorted in increasing order according to ID's; if C = 2 then the records must be sorted in non-decreasing order according to names; and if C = 3 then the records must be sorted in non-decreasing order according to grades. If there are several students who have the same name or grade, they must be sorted according to their ID's in increasing order.

Sample Input 1:

3 1
000007 James 85
000010 Amy 90
000001 Zoe 60

 

Sample Output 1:

000001 Zoe 60
000007 James 85
000010 Amy 90

 

Sample Input 2:

4 2
000007 James 85
000010 Amy 90
000001 Zoe 60
000002 James 98

 

Sample Output 2:

000010 Amy 90
000002 James 98
000007 James 85
000001 Zoe 60

 

Sample Input 3:

4 3
000007 James 85
000010 Amy 90
000001 Zoe 60
000002 James 90

 

Sample Output 3:

000001 Zoe 60
000007 James 85
000002 James 90
000010 Amy 90

主要思路

  1. 每个成员的信息应该储存在结构体中,所有成员的总和就储存在结构体数组中。
    struct node {
        int id;
        char name[10];
        int grade;
    } member[100005];

     

  2. 题中有三种要求的排序方法,对于结构体排序,可以直接使用c++"algorithm"库中的sort函数,具体如何使用可以看看这篇文章:排序算法 | sort函数的使用。只是cmp函数的编写稍微麻烦一点,要分成c值不同的三种情况。排序完直接输出即可。
    bool cmp(struct node x, struct node y) {
        switch (c) {
            case 1:
                return x.id < y.id;
            case 2:
                if (strcmp(x.name, y.name) != 0)
                    return strcmp(x.name, y.name) < 0;
                return x.id < y.id;
            case 3:
                if (x.grade != y.grade)
                    return x.grade < y.grade;
                return x.id < y.id;
        }
    }
    

    🔺注意点: 如果和我一样,id使用int型变量储存,输出的时候记得一定是6位,不足要补全零

完整AC代码如下:

//
// Created by LittleCat on 2020/2/13.
//
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

int c;

struct node {
    int id;
    char name[10];
    int grade;
} member[100005];

bool cmp(struct node x, struct node y) {
    switch (c) {
        case 1:
            return x.id < y.id;
        case 2:
            if (strcmp(x.name, y.name) != 0)
                return strcmp(x.name, y.name) < 0;
            return x.id < y.id;
        case 3:
            if (x.grade != y.grade)
                return x.grade < y.grade;
            return x.id < y.id;
    }
}

int main() {

    int n;
    scanf("%d %d", &n, &c);
    for (int i = 0; i < n; i++)
        scanf("%d %s %d", &member[i].id, member[i].name, &member[i].grade);

    sort(member, member + n, cmp);

    for (int i = 0; i < n; i++)
        printf("%06d %s %d\n", member[i].id, member[i].name, member[i].grade);
}

 



end 

欢迎关注个人公众号 鸡翅编程 ”,这里是认真且乖巧的码农一枚。

---- 做最乖巧的博客er,做最扎实的程序员 ----

旨在用心写好每一篇文章,平常会把笔记汇总成推送更新~

在这里插入图片描述

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值