題目出處:《資訊學奧賽一本通》第二章上機練習8。
題目描述
病人等級看病,編寫乙個程式,將登記的病人按照以下原則排出看病的先後順序:
老年人(年齡 \(\ge\) 60歲)比非老年人優先看病。
老年人按年齡從大到小的順序看病,年齡相同的按登記的先後順序排序。
非老年人按登記的先後順序排序。
輸入格式
第 \(1\) 行,輸入乙個不大於 \(1000\) 的正整數,表示病人的個數;
後面按照病人登記的先後順序,每行輸入乙個病人的資訊,包括:乙個長度不大於 \(10\) 的字串表示病人的 id(每個病人的id各不相同且只含數字和字母),乙個整數表示病人的年齡,中間用單個空格隔開。
輸出格式
按排好的看病順序輸出病人的id,每行乙個。
樣例輸入
5
020010 40
004312 15
010133 67
023815 75
102031 23
樣例輸出023815
010133
020010
004312
102031
題目分析
這道題目是結構體排序。
首先我們要思考的問題是怎麼定義結構體:因為病人的id包含數字和字元,所以我用乙個整數number
來表示病人的登記順序,用乙個字元陣列card
來表示病人的id,用乙個整數age
來表示病人的年齡。「病人」的英文是「patient」,所以我就開乙個名為patient
的結構體,並在定義結構體的同時初始化結構體陣列(我這裡用陣列a
表示):
struct patient a[1010];
比較函式按照題目描述來:
bool cmp(patient a, patient b)
else if (a.age >= 60) // a是老人,b不是老人
return true; // a排前面
else if (b.age >= 60) // b是老人,a不是老人
return false; // b排前面
else // 兩個都是年輕人
return a.number < b.number; // 按登記順序排
}
需要注意的是:因為輸入格式只告訴了我們病人的id和年齡,並沒有告訴我們登記的順序,所以我們還得主動為每一位病人標記登記的順序,最簡單的一種方式就是第 \(i\) 位病人的登記順序就是 \(i\) 。
實現**如下:
#include using namespace std;
struct patient a[1010];
int n;
bool cmp(patient a, patient b)
else if (a.age >= 60) // a是老人,b不是老人
return true; // a排前面
else if (b.age >= 60) // b是老人,a不是老人
return false; // b排前面
else // 兩個都是年輕人
return a.number < b.number; // 按登記順序排
}int main()
sort(a, a+n, cmp);
for (int i = 0; i < n; i ++)
cout << a[i].id << endl;
return 0;
}
排序入門練習題8 整數奇偶排序 題解
題目出處 資訊學奧賽一本通 第二章上機練習6,略有改編 題目描述 告訴你包含 n 個數的陣列 a 你需要把他們按照 奇數排前面,偶數排後面 奇數從從小到大排,偶數從大到小排 的順序輸出。輸入格式 輸入的第一行包含乙個整數 n 1 le n le 1000 輸入的第二行包含 n 個整數 a 1,a 2...
排序練習題
一 選擇題 1 以下序列不是堆的是 d a 100,85,98,77,80,60,82,40,20,10,66 b 100,98,85,82,80,77,66,60,40,20,10 c 10,20,40,60,66,77,80,82,85,98,100 d 100,85,40,77,80,60,6...
排序入門練習題2 從大到小排序 題解
題目出處 資訊學奧賽一本通 例2.1 題目描述 輸入 n 個數,將 n 個數按從大到小的順序輸出 n le 10000 輸入格式 輸入的第一行包含乙個整數 n le 10000 用於表示元素個數。接下來一行包含 n 個int範圍內的整數。輸出格式 輸出佔一行,用於表示 n 個整數從小到大排的結果,兩...