排序入門練習題10 病人排隊 題解

2022-08-19 22:24:10 字數 1865 閱讀 2533

題目出處:《資訊學奧賽一本通》第二章上機練習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 個整數從小到大排的結果,兩...