C++類和對象——7-3 宿舍誰最高?(效率一般但簡單明瞭的算法,附帶代碼說明)

學校選拔籃球隊員,每間宿舍最多有4個人。現給出宿舍列表,請找出每個宿舍最高的同學。定義一個學生類Student,有身高height,體重weight等。

輸入格式:
首先輸入一個整型數n (1<=n<=1000000),表示n位同學。
緊跟着n行輸入,每一行格式爲:宿舍號,name,height,weight。
宿舍號的區間爲[0,999999], name 由字母組成,長度小於16,height,weight爲正整數。

輸出格式:
按宿舍號從小到大排序,輸出每間宿舍身高最高的同學信息。題目保證每間宿舍只有一位身高最高的同學。

輸入樣例:
7
000000 Tom 175 120
000001 Jack 180 130
000001 Hale 160 140
000000 Marry 160 120
000000 Jerry 165 110
000003 ETAF 183 145
000001 Mickey 170 115
輸出樣例:
000000 Tom 175 120
000001 Jack 180 130
000003 ETAF 183 145

#include<iostream>
#include<iomanip>   //提供格式化輸出的頭文件
using namespace std;
class student {
    //由於題目沒有多餘要求,故將信息都設置爲公有數據成員
public:
    string name;    //姓名
    int no;         //宿舍號
    int height, weight;//身高,體重
//構造函數
    student() {}
    student(int n, string nm, int h, int w) :no(n), name(nm), height(h), weight(w) {}
    //輸出該同學的信息函數
    void display() {
        cout << setw(6) << setfill('0') << no;//按指定6位格式輸出宿舍號
        cout << " " << name << " " << height << " " << weight << endl;
    }
};
//聲明全局變量,內存地址固定,讀寫效率高,不然會出現段錯誤
student all[1000000];
int main() {
    int n;
    cin >> n;
    //假設所有宿舍都存在,每個對象代表一個宿舍裏的最高身高的學生
    //先初始化宿舍號和身高(身高爲0方便後面篩選)
    for (int i = 0; i < 1000000; i++) {
        all[0].no = i;
        all[0].height = 0;
    }
    //在初始化一個過渡對象用來收取輸入信息
    student x;
    int max = 0;//記錄一個最大門牌號以減少計算量
    while (n--) {
        cin >> x.no >> x.name >> x.height >> x.weight;
        if (x.height > all[x.no].height) {
            //同類對象可以賦值操作
            all[x.no] = x;
        }
        if (x.no > max)max = x.no;
    }//操作完成,再遍歷所有宿舍,輸出有人的信息
    for (int i = 0; i <= max; i++) {
        if (all[i].height != 0)all[i].display();
    }return 0;
}

By——Suki
我看很多別的博主寫的代碼運用了map容器,但是我還沒學到那裏,在最基礎的語法基礎下總結出的精煉代碼。如果有建議可以提出來我改進噢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章