ZeroJudge H075: 成績排名

電子計算機研究社要來社考了喔:D,總共要考 3 科,分別是資訊、數學、英文,每到這個考試的季節,社團內總是會充滿著競爭的味道,而在這個社團,有著特別的成績加權,

資訊成績必須乘以 5,數學則是乘以 3,英文乘以 2,最後取加權平均,

若遇同分則依照資訊、數學、英文的順序進行比較 (若皆同分則座號小的在前面),現在請你幫忙電子計算機研究社排名吧!

範例測資

範例輸入範例輸出
輸入一個整數 N,代表有 N 位學生參加考試,接著有 N 行輸入,每行輸入有 4 個整數A1、A2、A3、A4,分別代表學生的座號、資訊成績、數學成績、英文成績。輸出成績由高到低排列過的學生座號以及平均,每輸出一位學生即換行。
7
1 60 80 50
2 80 40 90
3 50 70 80
4 60 80 70
5 100 20 20
6 60 40 100
7 60 80 50
2 70
4 68
1 64
7 64
6 62
3 62
5 60
ZeroJudge H075 範例測資

解題思路

使用整數來收座號和三個成績,然後計算加權的平均。算法是「[(資訊*5) + (數學*3) + (英文*2)] / (5 + 3 + 2)」計算平均的時候需要計算成浮點數,記得要將成績先轉型再計算。

宣告一個 Vector<Vector<float>>,使用二維陣列來做排序,每一個人就是一個 Vector<float>。在收到資料之後將以下的資料依序 Push_Back 到 Vector<float> 中:加權平均 (浮點數)、資訊成績 (整數)、數學成績 (整數)、英文成績 (整數)、座號*-1。

將二維陣列排序之後要從最右邊輸出到最左邊,但是如果有全部同分的情況,座號比較大的就會排在較右邊,如果存資料的時候將座號*-1,這樣子比較小的座號就會排到比較右邊

再來要使用一個 If 判斷是,判斷加權平均時是否可以整除,如果可以整除的話,拿剛剛計算的浮點數轉換成字串的型態。並且使用 For迴圈 將小數點之前 (不包含小數點) 的字元都加到一個新的字串。使用 Map<Vector<float>, string>,Key 就是代表目前這個人的 Vector<float>,Value 就是剛剛相加完的字串,要用來輸出。

Else 的話就代表沒有辦法整除,就做跟 If 相同的事情,只是這一次要將字串加到小數點後一位的字元 (不需要四捨五入)。

輸出的時候要記得將座號再乘以 -1,平均值的話就是使用 Map[stu[i]] 來輸出剛剛相加好的字串就可以了。

範例程式碼-ZeroJudge H075: 成績排名

#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;

int main() {
    cin.sync_with_stdio(0);
    cin.tie(0);
    int N;
    cin >> N;
    vector<vector<float>>stu;
    map<vector<float>, string>MAP;
    for (int i = 0; i<N; i++)
    {
        vector<float>v;
        int id, com, math, eng;
        cin >> id >> com >> math >> eng;
        float tmp = (float(com*5) + float(math*3) + float(eng*2))/10.;
        v.push_back(tmp);
        v.push_back(com);
        v.push_back(math);
        v.push_back(eng);
        v.push_back(id * -1);
        if (((com*5) + (math*3) + (eng*2)) % 10 == 0)
        {
            string str = to_string(tmp), newstr = "";
            for (int j = 0; j<str.length(); j++)
            {
                if (str[j] == '.') break;
                newstr += str[j];
            }
            MAP[v] = newstr;
        }
        else
        {
            string str = to_string(tmp), newstr = "";
            for (int j = 0; j<str.length(); j++)
            {
                newstr += str[j];
                if (str[j] == '.')
                {
                    newstr += str[j+1];
                    break;
                }
            }
            MAP[v] = newstr;
        }
        stu.push_back(v);
    }
    sort(stu.begin(), stu.end());
    for (int i = N-1; i>=0; i--)
    {
        cout << stu[i][4] * -1 << " " << MAP[stu[i]] << "\n";
    }
}

//ZeroJudge H075
//Dr. SeanXD

發佈留言