一:题目
Excel可以对一组纪录按任意指定列排序。现请编写程序实现类似功能。
输入格式:
输入的第一行包含两个正整数N(≤10
5
) 和C,其中N是纪录的条数,C是指定排序的列号。之后有 N行,每行包含一条学生纪录。每条学生纪录由学号(6位数字,保证没有重复的学号)、姓名(不超过8位且不包含空格的字符串)、成绩([0, 100]内的整数)组成,相邻属性用1个空格隔开。
输出格式:
在N行中输出按要求排序后的结果,即:当C=1时,按学号递增排序;当C=2时,按姓名的非递减字典序排序;当C=3时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。
输入样例:
3 1
000007 James 85
000010 Amy 90
000001 Zoe 60
输出样例:
000001 Zoe 60
000007 James 85
000010 Amy 90
二:思路
这个题是用结构体存储 学号 姓名 成绩 三个变量,然后重写sort函数。
三:上码
/**思路:利用结构体存下,学号,姓名,成绩 ;然后重写sort函数*/#include<bits/stdc++.h>
using namespace std;struct Node{string id;string name;int grade;
};bool sort_id( Node a,Node b ){return a.id < b.id;}bool sort_name( Node a, Node b ){if( a.name == b.name ) //当名字相同时,按照id进行排序 return a.id < b.id;return a.name < b.name; }bool sort_grade( Node a, Node b ){if( a.grade == b.grade)//当成绩相同时,按照id进行排序 return a.id < b.id; return a.grade < b.grade;
}
int main(){int N,M;cin >> N >> M;//创建结构体数组Node *node = new Node[N]; for( int i = 0; i < N; i++ ){cin >> node[i].id >> node[i].name >> node[i].grade;}if( M == 1)sort(node,node+N,sort_id);if( M == 2)sort(node,node+N,sort_name);if( M == 3)sort(node,node+N,sort_grade);for( int i = 0; i < N; i++ ){cout << node[i].id << ' ' << node[i].name << ' ' << node[i].grade << endl;} }
补充超时解决:
1.这个需要卡时间,多提交几次就还可以卡过去。2.或则将cout cin 改成printf 和 scanf这些都是我的做题经验,亲试有效,但如果还不行,那就回炉重造。重新构思路,重新编码,一旦你写出来,再怎么改还是原来的套路,很可能还是过不去。
四:总结和踩过的坑
这个题思路是我第一次这么写,很明显,不是我想出来的,我是学习大佬的。但是我还是自己做了遍,用的是map容器,其时用map是不对的,因为我一看题是排序,然后就没仔细读题,看了下输出和输入就写码了,结果很显然,有3个点是过不去的,因为这个题还说会出现重复的名字和成绩,在map容器当中他的键值是不允许重复的,一旦重复,就会发生覆盖。然后我就上网学习大佬的,果然有收获,这种做法,是真的牛逼。哈哈哈哈哈哈哈学到了哈哈哈。
五:记录失败的思考结果
这是我用map做的,有3个点是过不去的。而且是无法修复的,仅此记录一下。
#include<bits/stdc++.h>
using namespace std;int main(){int N,M;map<string,string>m1,m2;map<string,string>:: iterator t;cin >> N >> M;for( int i = 0; i < N; i++ ){string a,b,c;cin >> a >> b >> c;if(M == 1){m1[a] = b;m2[a] = c;}if(M == 2){m1[b] = a;m2[b] = c;}if(M == 3){m1[c] = a;m2[c] = b;}} if( M == 1){for( t = m1.begin(); t != m1.end(); t++ ){cout << t->first << ' ' << t->second <<' '<< m2[t->first] << endl;}}if( M == 2){for( t = m1.begin(); t != m1.end(); t++ ){cout << t->second << ' ' << t->first <<' '<< m2[t->first] << endl;}} if( M == 3 ){for( t = m1.begin(); t != m1.end(); t++ ){cout << t->second << ' ' << m2[t->first] <<' '<< t->first << endl;}} }//3 3
//000007 James 85
//000010 Amy 90
//000001 Zoe 60