【PAT甲级 - C++题解】1028 List Sorting

简介: 【PAT甲级 - C++题解】1028 List Sorting

1028 List Sorting

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 (≤105) 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 9


Sample Output 3:

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


题意


第一行给定学生人数 N 和序号 C 。


按照给定序号数对学生进行排序:


如果 C = 1 ,则按照 ID 升序的顺序排序。


如果 C = 2 ,则按照名称以不降序的顺序排序。


如果 C = 3 ,则按照成绩以不降序的顺序排序。


当出现学生名字相同或是成绩相同的情况时,按照 ID 升序的顺序,对他们进行排序。


思路

  1. 用结构体数组存储学生信息,注意要用 scanf 输入,这题数据量比较大,用 cin 会超时。
  2. 分别设定三个比较函数,然后根据给定的 C 值进行对应的排序。
  3. 输出排序后的结果。

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
struct Student {
    string id, name;
    int grade;
}all[N];
//按照id升序排序
bool cmp1(Student& s1, Student& s2)
{
    return s1.id < s2.id;
}
//按照名字升序排序
bool cmp2(Student& s1, Student& s2)
{
    if (s1.name != s2.name)    return s1.name < s2.name;
    return s1.id < s2.id;
}
//按照成绩升序排序
bool cmp3(Student& s1, Student& s2)
{
    if (s1.grade != s2.grade)  return s1.grade < s2.grade;
    return s1.id < s2.id;
}
int main()
{
    int n, c;
    scanf("%d %d", &n, &c);
    //输入学生信息
    char id[10], name[10];
    for (int i = 0; i < n; i++)
    {
        int grade;
        scanf("%s %s %d", &id, &name, &grade);
        all[i] = { id,name,grade };
    }
    if (c == 1)    sort(all, all + n, cmp1);   //按照id升序排序
    else if (c == 2)   sort(all, all + n, cmp2);   //按照名字升序排序
    else    sort(all, all + n, cmp3);   //按照成绩升序排序
    //输出排序结果
    for (int i = 0; i < n; i++)
        printf("%s %s %d\n", all[i].id.c_str(), all[i].name.c_str(), all[i].grade);
    return 0;
}
目录
相关文章
|
5天前
|
算法 C++ 容器
模拟实现c++中的list模版
模拟实现c++中的list模版
|
2月前
|
编译器 C语言 C++
【c++丨STL】list模拟实现(附源码)
本文介绍了如何模拟实现C++中的`list`容器。`list`底层采用双向带头循环链表结构,相较于`vector`和`string`更为复杂。文章首先回顾了`list`的基本结构和常用接口,然后详细讲解了节点、迭代器及容器的实现过程。 最终,通过这些步骤,我们成功模拟实现了`list`容器的功能。文章最后提供了完整的代码实现,并简要总结了实现过程中的关键点。 如果你对双向链表或`list`的底层实现感兴趣,建议先掌握相关基础知识后再阅读本文,以便更好地理解内容。
47 1
|
2月前
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
71 7
|
2月前
|
存储 编译器 C++
C++ initializer_list&&类型推导
在 C++ 中,`initializer_list` 提供了一种方便的方式来初始化容器和传递参数,而右值引用则是实现高效资源管理和移动语义的关键特性。尽管在实际应用中 `initializer_list&&` 并不常见,但理解其类型推导和使用方式有助于深入掌握现代 C++ 的高级特性。
28 4
|
4月前
|
存储 算法 C++
【C++打怪之路Lv10】-- list
【C++打怪之路Lv10】-- list
33 1
|
4月前
|
存储 缓存 C++
C++番外篇——list与vector的比较
C++番外篇——list与vector的比较
39 0
|
4月前
|
C++
C++番外篇——list的实现
C++番外篇——list的实现
29 0
|
2天前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
5天前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)
|
2天前
|
安全 编译器 C语言
【C++篇】深度解析类与对象(中)
在上一篇博客中,我们学习了C++类与对象的基础内容。这一次,我们将深入探讨C++类的关键特性,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、以及取地址运算符的重载。这些内容是理解面向对象编程的关键,也帮助我们更好地掌握C++内存管理的细节和编码的高级技巧。