PAT

    技术2026-01-10  9

    Java路途在此受阻,有三个测试点无论如何也过不去 只好记录大佬C++代码记录学习

    解题思想

    本题是典型的排序问题,这里我们使用C++标准模版库(STL)里面的sort()函数。具体过程如下:

    定义student结构体类型,成员包括:准考证号、德分、才分以及考生类别。考生类别用于区分5类不同的考生,简化排序过程。在输入过程中根据每位考生的分数来确定考生的类别。输入并分类完毕,接下来就要用到强大的sort()函数了。首先,sort()函数的格式为:

    sort(第一个元素的地址,最后一个元素的下一个地址[,比较函数])

    其中,[]内为可选项,它是用来规定排序的规则的,默认是简单的升序排序。如果要实现稍复杂的排序,就需要我们自行构建比较函数内部的规则了(比如此题构建的cmp()函数)。

    下面详解一下cmp()函数的构造细节:

    先按考生类别由低到高排序同一类别考生,按德才总分由高到低排序同类考生,德才总分相同时按德分降序排序同类考生,德分才分均相同时按准考证号的升序排序

    构造完cmp()后,一句代码即可完成本题排序,简单粗暴有效!

    sort(stu,stu + n,cmp);//注意sort()函数的第二个参数为最后一个元素的下一个位置

    知识拓展

    毫无疑问,在上机考试中最适合使用的语言就是C语言和C++了,虽然java和python用的人更多,但是它们的执行效率相对于C/C++而言要慢很多,经常会造成超时。因此,我所做的示例代码一般都是C/C++来写的,前面的几道题为了让大家适应,我选择了用全C语言的方式,但是C语言虽然有很多优点,但是它是有一些不太顺手的规则的,C++是向下兼容C的,而且C++中有一些比较好用的特性可以使我们的编程更便捷,因此,接下来题目的示例代码中,我将逐步加入C++的一些元素。请注意,以后的代码在编辑器中一定要保存为.cpp文件,这是C++文件的扩展名,这是为了利用C++的一些好的特性。 C++标准中头文件书写格式一般为cstdio,它等价于C语言的stdio.h的写法。推荐以后用C++的书写形式,即

    #include <cstdio>

    你可能会觉得C语言的标准格式输入输出函数scanf和printf太麻烦,因为它还要指定输入输出格式,而C++的cin和cout相比而言就显得非常简单。但是,我还是建议大家用scanf和printf来进行输入输出,因为,cin和cout要比scanf和printf消耗更多的时间,很容易在输入输出中产生超时。

    C++的main()函数位置上面一般会有一句

    using namespace std;

    所谓namespace,即为名字空间,标准C++中引入名字空间的概念,把标准库里面的一些东西封装到std名字空间中。使用using编译命令导入所有的名称。使用C++的一些标准模版库时,一般需要添加此句。初学者,每一个C++程序最好都这样做。

    #include <cstdio> #include <algorithm> #define MAXN 100001 using namespace std; struct student { int id;//准考证号 int mor_score;//德分 int abi_score;//才分 int category;//类别 }stu[MAXN]; //排序规则函数cmp bool cmp(student a, student b) { if(a.category != b.category){//先按考生类别由低到高排序 return a.category < b.category; } //同一类别考生,按德才总分由高到低排序 else if((a.mor_score + a.abi_score) != (b.mor_score + b.abi_score)){ return (a.mor_score + a.abi_score) > (b.mor_score + b.abi_score); } //同类考生,德才总分相同时按德分降序排序 else if(a.mor_score != b.mor_score){ return a.mor_score > b.mor_score; } //同类考生,德分才分均相同时按准考证号的升序输出 else{ return a.id < b.id; } } int main() { int n,l,h,i,cou = 0;//cou统计未达标考生人数 scanf("%d%d%d",&n,&l,&h); for(i = 0; i < n; i++){ scanf("%d%d%d",&stu[i].id,&stu[i].mor_score,&stu[i].abi_score); if(stu[i].mor_score >= h&&stu[i].abi_score >= h){ stu[i].category = 1;//第一类考生,即“德才全尽” } else if(stu[i].mor_score >= h&&stu[i].abi_score >= l){ stu[i].category = 2;//第二类考生,即“德胜才” } else if(stu[i].mor_score >= l&&stu[i].abi_score >= l &&stu[i].mor_score >= stu[i].abi_score){ stu[i].category = 3;//第三类考生,即“才德兼亡”但尚有“德胜才” }else if(stu[i].mor_score >= l&&stu[i].abi_score >= l){ stu[i].category = 4;//第四类考生,即其他达到最低线 L 的考生 } else{ stu[i].category = 5;//第五类考生,未达最低线,不参与排名 cou++; } } sort(stu,stu + n,cmp);//注意sort()函数的第二个参数为最后一个元素的下一个位置 printf("%d\n",n-cou);//输出达标考生人数 for(i = 0; i < n-cou; i++){ printf("%d %d %d\n",stu[i].id,stu[i].mor_score,stu[i].abi_score); } return 0; }
    Processed: 0.016, SQL: 9