固定模式
要排序的量一般放在一个或多个向量的结构体、unordered_map或者set中,然后定义一个或多个cmp函数。(具体是几个就看题目将排序对象分成几种、有几个判断依据)。
坑点
1.最好直接用unordered_map代替map,就不会有查询超时
2.题目的要求都会有测试点,所以要好好读题,归纳出每种情况,想好再写,代码的复杂度其实不高的
普通题库(1001-1136)
- 1012 The Best Rank (25)
因为科目是固定的,而且要经过多次排序,就直接定义好数组方便访问:struct node { int id, best; int score[4], rank[4]; }stu[2005];
- 1025 PAT Ranking (25)
//10位数以内可以用int,长了就用long long //搞排名的时候,可以先写定第一项,后面的靠判断: v[0].locarank = 1; fin.push_back(v[0]); for(int j = 1; j < m; j++) { v[j].locarank = (v[j].score == v[j - 1].score) ? (v[j - 1].locarank) : (j + 1); fin.push_back(v[j]); } //考生编号可能前头有0,0也要要输出: %013lld //输出long long格式的数"
- 1028 List Sorting (25)
技巧:不要用string,原理上的解释我查不到,只知道姓名长度不同,比到短的就退了。测试结果是没有规律的,真的不能用。
char name[20]; //不降序输出人名,strcmp就是ascii码左减右 if(strcmp(a.name, b.name) == 0) return a.no < b.no; return strcmp(a.name, b.name) <= 0;
- 1036 Boys vs Girls (25)
- 1038 Recover the Smallest Number (30)
//排序的时候,需要考虑0的存在,即03和2组成的,是032小于203: bool cmp0(string a, string b) { return a + b < b + a; } //但不要输出0: while(s.length() != 0 && s[0] == '0') s.erase(s.begin()); if(s.length() == 0) cout << 0; cout << s;
- 1062 Talent and Virtue (25)
- 1075 PAT Judge (25)
- 1083 List Grades (25)