【PAT甲级】排序题专题复习

固定模式

要排序的量一般放在一个或多个向量的结构体、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)

真题题库(近三年)

猜你喜欢

转载自blog.csdn.net/allisonshing/article/details/107458182