PAT:1080 MOOC期終成績
阿新 • • 發佈:2018-12-13
題目:
解題思想:
題目上有一句“必須首先獲得不少於200分的線上程式設計作業分”,這是解題的關鍵,所以我們首先要排除程式設計分少於200的(只有程式設計成績不少於200的人的資訊才要記錄)。因為一開始只能讀入程式設計成績,所以還沒讀入的成績儲存為-1(也正好符合題目上說的)。順便把(學號-下標)儲存到map容器中(為了新增其他成績的時候能直接判斷該同學的程式設計成績是否合格和直接通過下標來更新他的其它成績)。最後計算出最終成績,把合格的同學篩選打印出來。
題解:
#include<iostream> #include<map> #include<vector> #include<algorithm> using namespace std; class Student { public: string no; int pscore, mscore,fscore,sumscore; Student(string no, int pscore, int mscore, int fscore, int sumscore) { this->no = no; this->pscore = pscore; this->mscore = mscore; this->fscore = fscore; this->sumscore = sumscore; } }; bool cmp(Student v1, Student v2) { if (v1.sumscore != v2.sumscore) return v1.sumscore>v2.sumscore; else return v1.no<v2.no; } int main() { // freopen("D://test.txt","r",stdin); string no; int score, p, m, f, cnt = 1; vector<Student> v;//用來儲存物件(學號成績資訊) map<string, int> mp; //用來儲存學號和容器下標 cin >> p >> m >> f; //儲存程式設計成績和學號 for (int i = 0; i<p; i++) { cin >> no>> score; if (score >= 200) { v.push_back(Student(no, score, -1, -1, 0)); //儲存的下標+1,因為通過[]訪問不存在的值返回的就是0,所以下標+1來作為區別 mp.insert(make_pair(no, cnt++)); } } //更新期中成績,沒有更新的依舊為-1 for (int i = 0; i<m; i++) { cin >> no >> score; //如果該學號的人在map容器中查詢不到,則mp[no]為0 if (mp[no] != 0) { v[mp[no] - 1].mscore = score; } } //更新期末成績 for (int i = 0; i<f; i++) { cin >> no >> score; if (mp[no] != 0) { v[mp[no] - 1].fscore = score; } } //計算最終成績 for (unsigned int i = 0; i<v.size(); i++) { int mscore = 0, fscore = 0; if (v[i].mscore != -1) mscore = v[i].mscore; if (v[i].fscore != -1) fscore = v[i].fscore; if (mscore>fscore) { //浮點數轉換成整數只會向下取整,加上0.5後就能四捨五入 v[i].sumscore = mscore*0.4 + fscore*0.6+0.5; } else v[i].sumscore = fscore; } sort(v.begin(), v.end(), cmp); //打印出最終成績不小於60的同學 for (auto it = v.begin(); it != v.end(); it++) { if (it->sumscore >= 60) { cout << it->no << " " << it->pscore << " " << it->mscore << " " << it->fscore << " " << it->sumscore << endl; } } return 0; }
踩坑:
- 如果map<string,int> a;容器中不存在鍵值為1的元素對,則a["1"]等於0。
- 四捨五入的取法。