时间限制
Input
Each input file contains one test case. For each case, the first line contains two integers N (<=100000) 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
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 90
Sample Output 3
000001 Zoe 60 000007 James 85 000002 James 90 000010 Amy 90
============================================
这个题目能想到最好的办法,就是用set然后重载一个自定义排序了 感谢郭嘉,感谢STL!
set这个东西嘛,好像是用红黑树还是什么实现的(印象中是这样的) 原来打算用vector的,但是vector好像不能在插入的时候就根据自定义的排序方法排序好插进去,这样如果全部录入完了整体排序一遍是不是更耗费时间呢?
参考文章:
http://blog.csdn.net/stone_sky/article/details/8471722 讲的是自定义排序 http://zhidao.baidu.com/question/189798009.html 讲的是输出填0格式化问题 http://www.189works.com/article-43335-1.html http://wenku.baidu.com/view/08c0eb0bff00bed5b9f31d29.html 这两个就是自定义排序了
这题目这么搞了以后就简单多了:)当然最后一个测试点还是用了100ms…不管了过了就行 ============================================
#include #include #include #include using namespace std; int compareName(const char name1[],const char name2[]) { for(int i=0; i<8; i++) { if( name1[i] < name2[i] ) return 1; else if(name1[i] > name2[i]) return -1; //相等的话继续比较 } return 0; //相同的名字 } struct StudentRecord { int ID; char name[9]; int grade; int sortType; //按哪一列排序,1,2,3 StudentRecord(){} StudentRecord(int _id, char _name[], int _grade, int _sortType) { ID = _id; strcpy(name, _name); grade = _grade; sortType = _sortType; } void set(int _id, char _name[], int _grade) { ID = _id; strcpy(name, _name); grade = _grade; } //自定义排序方法 bool operator< (const StudentRecord& other) const { int cmpResult; switch(sortType) { case 1: //按照ID升序排列 return ID < other.ID; case 2: //按照姓名的升序排列,如果有同名再按ID升序 cmpResult = compareName(name, other.name); if(cmpResult > 0) return true; else if (cmpResult < 0) return false; else return ID < other.ID; case 3: //按照成绩的升序排列,如果有同名成绩按ID升序 if (grade == other.grade) return ID < other.ID; else return grade < other.grade; default: printf("ERROR!"); return false; } } }; set records; int main() { long N; int C; scanf("%ld %d", &N, &C); StudentRecord singleRec; singleRec.sortType = C; for(long i=0; i<N; i++) { int ID, grade; char name[8]; scanf("%d %s %d", &ID, name, &grade); singleRec.set(ID, name, grade); records.insert(singleRec); } set::iterator it; for(it = records.begin(); it != records.end(); it++) { StudentRecord sr = *it; printf("%06d %s %dn", sr.ID, sr.name, sr.grade); } return 0; }
====================================
测试点
测试点 | 结果 | 用时(ms) | 内存(kB) | 得分/满分 |
---|---|---|---|---|
0 | 答案正确 | 0 | 790 | 5/5 |
1 | 答案正确 | 0 | 740 | 5/5 |
2 | 答案正确 | 0 | 750 | 5/5 |
3 | 答案正确 | 0 | 790 | 2/2 |
4 | 答案正确 | 0 | 790 | 2/2 |
5 | 答案正确 | 0 | 740 | 2/2 |
6 | 答案正确 | 100 | 8970 | 4/4 |