1. 程式人生 > >PAT題解——1083. List Grades (25)

PAT題解——1083. List Grades (25)

[宣告]:由於本人在使用《演算法筆記》的過程中有部分題解和《演算法筆記》上的解法不同,特此作為記錄,同時可以提供新的思路供讀者參考;
1. 題目連結:https://www.patest.cn/contests/pat-a-practise/1083
2.解題思路:本題思路較簡單,不多贅述;本題解和《演算法筆記》上的題解區別在於如何輸出符合grade範圍的結構體資訊;《演算法筆記》中採用先整體排序後再依次判斷年齡是否符合範圍,符合則輸出;比較簡潔明瞭;不過我採用另一種方法,在此提供思路:在每個結構體中加入flag來標記是否符合範圍,符合則標記為1,然後在排序(優先順序flag>grade);最後按序輸出flag=1的資訊;


3. AC程式碼:

#include<cstdio>
#include<algorithm>
using namespace std;
struct s{
    int flag; //在每個結構體中設定一個flag用來判斷是否在要查詢的grade範圍內
    char name[15];
    char id[15];
    int grade;
}stu[100];
bool cmp(s a,s b){ //flag=1表示在查詢範圍內,排在flag=0的前面
    if(a.flag!=b.flag) return a.flag>b.flag;
    else
return a.grade>b.grade; } int main(){ int N;scanf("%d",&N); for(int i=0;i<N;i++){ scanf("%s %s %d",stu[i].name,stu[i].id,&stu[i].grade); } int gl,gh; //grade-low和grade-high scanf("%d%d",&gl,&gh); for(int i=0;i<N;i++){ if(stu[i].grade>=gl&&stu[i].grade<=gh) stu[i].flag=1
; //標記flag else stu[i].flag=0; } sort(stu,stu+N,cmp);//排序; for(int i=0;i<N;i++){ if(stu[0].flag==0){ //說明沒有flag=1,即沒有符合grade範圍的人; printf("NONE\n");break; } if(stu[i].flag) printf("%s %s\n",stu[i].name,stu[i].id); //輸出符合grade範圍的人 } }