【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;
}
目录
相关文章
|
算法 C++ 容器
模拟实现c++中的list模版
模拟实现c++中的list模版
|
编译器 C语言 C++
【c++丨STL】list模拟实现(附源码)
本文介绍了如何模拟实现C++中的`list`容器。`list`底层采用双向带头循环链表结构,相较于`vector`和`string`更为复杂。文章首先回顾了`list`的基本结构和常用接口,然后详细讲解了节点、迭代器及容器的实现过程。 最终,通过这些步骤,我们成功模拟实现了`list`容器的功能。文章最后提供了完整的代码实现,并简要总结了实现过程中的关键点。 如果你对双向链表或`list`的底层实现感兴趣,建议先掌握相关基础知识后再阅读本文,以便更好地理解内容。
306 2
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
438 7
|
存储 编译器 C++
C++ initializer_list&&类型推导
在 C++ 中,`initializer_list` 提供了一种方便的方式来初始化容器和传递参数,而右值引用则是实现高效资源管理和移动语义的关键特性。尽管在实际应用中 `initializer_list&&` 并不常见,但理解其类型推导和使用方式有助于深入掌握现代 C++ 的高级特性。
210 4
|
存储 算法 C++
【C++打怪之路Lv10】-- list
【C++打怪之路Lv10】-- list
194 1
|
存储 缓存 C++
C++番外篇——list与vector的比较
C++番外篇——list与vector的比较
292 0
|
C++
C++番外篇——list的实现
C++番外篇——list的实现
163 0
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
10月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
423 12
|
8月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
227 0