PAT_甲級_1137 Final Grading (25point(s)) (C++)【模擬/成績排序】

目錄

1,題目描述

題目大意

注意

2,思路

3,AC代碼

4,解題過程

第一搏

第二搏


1,題目描述

Sample Input:

6 6 7
01234 880
a1903 199
ydjh2 200
wehu8 300
dx86w 220
missing 400
ydhfu77 99
wehu8 55
ydjh2 98
dx86w 88
a1903 86
01234 39
ydhfu77 88
a1903 66
01234 58
wehu8 84
ydjh2 82
missing 99
dx86w 81

 

Sample Output:

missing 400 -1 99 99
ydjh2 200 98 82 88
dx86w 220 88 81 84
wehu8 300 55 84 84

題目大意

 根據學生各個項目的分數排序,並對滿足資格的同學給出獲獎證書。

 

注意

  • G must be rounded up to an integer:G要四捨五入
  • he/she must first obtain no less than 200 points from the online programming assignments, and then receive a final grade no less than 60 out of 100:編程成績要大於等於200且最終成績大於等於60,才有資格獲得證書
  • The final grade is calculated by G=(G​mid−term​​×40%+G​final​​×60%) if G​mid−term​​>G​final​​, or G​final​​ will be taken as the final grade G:期中成績大於期末成績時,按照權重計算最終成績。否則取期末成績作爲最終成績;

 

2,思路

接受每項的成績,並在map中記錄。遍歷map將有資格的同學放入ans中,並對其排序。

 

3,AC代碼

#include<bits/stdc++.h>
using namespace std;
struct node{
    string name;
    int Gp = -1, Gm = -1, Gf = -1, G = -1;//Gp:編程練習 Gm:期中成績 Gf:期末成績 G:最終成績
};
bool cmp1(node a, node b){
    return a.G != b.G ?  a.G > b.G : a.name < b.name;
}
int main(){
#ifdef ONLINE_JUDGE
#else
    freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE
    int P, M, N, score;
    string name;
    scanf("%d%d%d", &P, &M, &N);
    unordered_map<string, node> data;
    vector<node> ans;
    for(int i = 0; i < P; i++){
        cin>>name>>score;
        data[name].name = name;
        data[name].Gp = score;
    }
    for(int i = 0; i < M; i++){
        cin>>name>>score;
        data[name].Gm = score;
    }
    for(int i = 0; i < N; i++){
        cin>>name>>score;
        data[name].Gf = score;
        data[name].G = data[name].Gm > data[name].Gf ? (data[name].Gm*0.4+data[name].Gf*0.6+0.5) : (data[name].Gf);
    }
    for(auto it : data){
        if(it.second.Gp >= 200 && it.second.G >= 60)
            ans.push_back(it.second);
    }
    sort(ans.begin(), ans.end(), cmp1);
    for(auto it : ans){
        cout<<it.name<<' ';
        //printf("%d %d %d %d\n", it.Gp, it.Gm==0 ? -1 : it.Gm, it.Gf==0 ? -1 : it.Gf, it.G);
        printf("%d %d %d %d\n", it.Gp, it.Gm, it.Gf, it.G);
    }
    return 0;
}

4,解題過程

第一搏

理解題意後,感覺不是很難的模擬題。

#include<bits/stdc++.h>
using namespace std;
struct node{
    string name;
    int Gp, Gm, Gf, G;//Gp:編程練習 Gm:期中成績 Gf:期末成績 G:最終成績
};
bool cmp1(node a, node b){
    if(a.G != b.G) return a.G > b.G;
    else return a.name < b.name;
}
int main(){
#ifdef ONLINE_JUDGE
#else
    freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE
    int P, M, N, score;
    string name;
    scanf("%d%d%d", &P, &M, &N);
    unordered_map<string, node> data;
    vector<node> ans;
    for(int i = 0; i < P; i++){
        cin>>name>>score;
        data[name].name = name;
        data[name].Gp = score;
    }
    for(int i = 0; i < M; i++){
        cin>>name>>score;
        data[name].Gm = score;
    }
    for(int i = 0; i < N; i++){
        cin>>name>>score;
        data[name].Gf = score;
        data[name].G = data[name].Gm > data[name].Gf ? (data[name].Gm*0.4+data[name].Gf*0.6+0.5) : (data[name].Gf);
    }
    for(auto it : data){
        if(it.second.Gp >= 200 && it.second.G >= 60)
            ans.push_back(it.second);
    }
    sort(ans.begin(), ans.end(), cmp1);
    for(auto it : ans){
        cout<<it.name<<' ';
        printf("%d %d %d %d\n", it.Gp, it.Gm==0 ? -1 : it.Gm, it.Gf==0 ? -1 : it.Gf, it.G);
    }
    return 0;
}

第二搏

理論上應該是沒有問題的,唯一可疑的地方就是初始化那塊了。。。

於是我在結構體中直接將各個分數賦初值爲-1:

666,不管怎樣以後一定要賦初值!這已經是第二次了。。。 

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