PAT_B_1015_C++(25分)
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++的書寫形式,即
你可能會覺得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; }總結
以上是生活随笔為你收集整理的PAT_B_1015_C++(25分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 制作sitemap与在线生成网站地图并提
- 下一篇: Win10系统edge无法上网怎么办 W