题目描述
Excel可以对一组纪录按任意指定列排序。现请你编写程序实现类似功能。
对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始)。随后在 N 行中输出按要求排序后的结果,即:当 C=1 时,按学号递增排序;当 C=2时,按姓名的非递减字典序排序;当 C=3 时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。
输入
测试输入包含若干测试用例。每个测试用例的第1行包含两个整数 N (N<=100000) 和 C,其中 N 是纪录的条数,C 是指定排序的列号。以下有N行,每行包含一条学生纪录。每条学生纪录由学号(6位数字,同组测试中没有重复的学号)、姓名(不超过8位且不包含空格的字符串)、成绩(闭区间[0, 100]内的整数)组成,每个项目间用1个空格隔开。当读到 N=0 时,全部输入结束,相应的结果不要输出。
输出
对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始)。随后在 N 行中输出按要求排序后的结果,即:当 C=1 时,按学号递增排序;当 C=2时,按姓名的非递减字典序排序;当 C=3 时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。
样例输入
4 1
000001 Zhao 75
000004 Qian 88
000003 Li 64
000002 Sun 90
4 2
000005 Zhao 95
000011 Zhao 75
000007 Qian 68
000006 Sun 85
4 3
000002 Qian 88
000015 Li 95
000012 Zhao 70
000009 Sun 95
0 3
样例输出
Case 1:
000001 Zhao 75
000002 Sun 90
000003 Li 64
000004 Qian 88
Case 2:
000007 Qian 68
000006 Sun 85
000005 Zhao 95
000011 Zhao 75
Case 3:
000012 Zhao 70
000002 Qian 88
000009 Sun 95
000015 Li 95
解答
#include<iostream>
#include<algorithm>
using namespace std;
class student{
public:
string id;
string name;
int score;
};
//按学号递增排序
bool cmp1(const student& s1,const student& s2){
return s1.id < s2.id;
}
//按姓名的非递减字典序排序
bool cmp2(const student& s1,const student& s2){
if(s1.name != s2.name) return s1.name < s2.name;
else return s1.id < s2.id;
}
//按成绩的非递减排序
bool cmp3(const student& s1,const student& s2){
if(s1.score != s2.score) return s1.score < s2.score;
else return s1.id < s2.id;
}
int main(void){
int N,type;
int num = 1;
while(1){
scanf("%d%d",&N,&type);
if(N == 0) return 0;
student S[N];
//读取数据
for(int i = 0; i < N; i++){
cin >> S[i].id >> S[i].name >> S[i].score;
cin.get(); //读取换行符
}
if(N == 1){
cout << "Case " << num << ":" << endl;
cout << S[0].id << " " << S[0].name << " " << S[0].score << endl;
}
else{
switch(type){
case 1: sort(S+0, S+N, cmp1); break;
case 2: sort(S+0, S+N, cmp2); break;
case 3: sort(S+0, S+N, cmp3); break;
}
cout << "Case " << num << ":" << endl;
for(int i = 0; i < N; i++)
cout << S[i].id << " " << S[i].name << " " << S[i].score << endl;
}
num++;
}
}
思路
做这道题要的是仔细看题,不知道在仔细看题上吃过多少次亏了orz
首先是输出的时候要多输出一行Case:i,然后记住 i 是测试用例的个数而不是测试用例用的什么方式排序orz
接下来就是真正的思路了,编写sort函数的第三个参数cmp来制订排序规则,这里不多说sort函数第三个函数干什么用的,真想刷算法的可以去买本《算法笔记》然后配套刷题,6.9.6节里面有关于sort函数的用法解析
这道题大体的思路就是编写结构体数组将读取输入然后利用编写好的cmp规则根据type的不同来调用不同的函数进行排序。
这里用struct是会更简单些,但最近在学C++所以想用类方法做,所以我一开始用了class使用了构造函数,之后建造类数组时用了 student *S[N] 这个类数组指针来构造,但后来发现将S的开始地址和结束地址传进去时一直在报错,搞了好久最后放弃了orz,选择直接用student S[N]来构造然后将S+0和S+N做为起始地址和结束地址传进去。但这样的话其实跟struct没有任何区别了orz。
以后做这类题的话我还是直接用struct吧orz。