【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;
}
目录
相关文章
|
4天前
|
算法 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`模拟实现的文章。
69 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的比较
37 0
|
4月前
|
C++
C++番外篇——list的实现
C++番外篇——list的实现
29 0
|
7月前
|
Java API Apache
怎么在在 Java 中对List进行分区
本文介绍了如何将列表拆分为给定大小的子列表。尽管标准Java集合API未直接支持此功能,但Guava和Apache Commons Collections提供了相关API。
|
7月前
|
运维 关系型数据库 Java
PolarDB产品使用问题之使用List或Range分区表时,Java代码是否需要进行改动
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
7月前
|
存储 Java 索引
Java List接口实现原理与性能评估
Java List接口实现原理与性能评估