PAT題解——1083. List Grades (25)
阿新 • • 發佈:2019-02-08
[宣告]:由於本人在使用《演算法筆記》的過程中有部分題解和《演算法筆記》上的解法不同,特此作為記錄,同時可以提供新的思路供讀者參考;
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範圍的人
}
}