1080 MOOC期終成績 ——C++實現
題目
1080 MOOC期終成績 (25 分)
對於在中國大學MOOC(http://www.icourse163.org/ )學習“資料結構”課程的學生,想要獲得一張合格證書,必須首先獲得不少於200分的線上程式設計作業分,然後總評獲得不少於60分(滿分100)。總評成績的計算公式為 G=(Gmid−term×40%+Gfinal×60%),如果 Gmid−term>Gfinal;否則總評 G 就是 Gfinal。這裡 Gmid−term 和 Gfinal 分別為學生的期中和期末成績。
現在的問題是,每次考試都產生一張獨立的成績單。本題就請你編寫程式,把不同的成績單合為一張。
輸入格式:
輸入在第一行給出3個整數,分別是 P(做了線上程式設計作業的學生數)、M(參加了期中考試的學生數)、N(參加了期末考試的學生數)。每個數都不超過10000。
接下來有三塊輸入。第一塊包含 P 個線上程式設計成績 Gp;第二塊包含 M 個期中考試成績 Gmid−term;第三塊包含 N 個期末考試成績 Gfinal。每個成績佔一行,格式為:
學生學號 分數
。其中學生學號
為不超過20個字元的英文字母和數字;分數
是非負整數(程式設計總分最高為900分,期中和期末的最高分為100分)。輸出格式:
打印出獲得合格證書的學生名單。每個學生佔一行,格式為:
學生學號
Gp Gmid−term Gfinal G如果有的成績不存在(例如某人沒參加期中考試),則在相應的位置輸出“−1”。輸出順序為按照總評分數(四捨五入精確到整數)遞減。若有並列,則按學號遞增。題目保證學號沒有重複,且至少存在1個合格的學生。
輸入樣例:
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
輸出樣例:
missing 400 -1 99 99 ydjh2 200 98 82 88 dx86w 220 88 81 84 wehu8 300 55 84 84
演算法
這道題我的思路是比較好的,首先先根據Gp篩選出符合的學生,顯然要用map<string,int>處理,再把輸入的Gm存到結構體中,然後根據輸入的Gf算出最後的成績,成績合格就進行輸出。而不是將所有的資訊都存起來。
1、因為所有人必須要G程式設計>=200分,所以用v陣列儲存所有G程式設計>=200的人,(一開始gm和gf都為-1),用map對映儲存名字所對應v中的下標(為了避免與“不存在”混淆,儲存下標+1,當為0時表示該學生的姓名在v中不存在)
2、G期中中出現的名字,如果對應的map並不存在(==0),說明該學生程式設計成績不滿足條件,則無須儲存該學生資訊。將存在的人的期中考試成績更新
3、G期末中出現的名字,也必須保證在map中存在。先更新G期末和G總為新的成績,當G期末<G期中時再將G總更新為(G期中x 40% + G期末x 60%)
4、將v陣列中所有G總滿足條件的放入ans陣列中,對ans排序(總分遞減,總分相同則姓名遞增),最後輸出ans中的學生資訊
但是很顯然的問題是程式碼能力不足,因此有這個想法程式設計的過程由於熟練能力不足,漏洞百出。後來參考了網上程式碼,驚為天人……
程式碼
//1080. MOOC期終成績v1
#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
struct node{
string name;
int gp,gm,gf,g;
};
bool cmp(node a,node b){
//如果分數不相等,就按成績由高到低排序;否則,按照姓名由小到大排序
return a.g!=b.g ?a.g>b.g:a.name<b.name;
}
map<string,int> idx;
int main(){
int p,m,n,score,cnt=1;
cin>>p>>m>>n;
vector<node> v,ans;
string s;
for(int i=0;i<p;i++){ //gp
cin>>s>>score;
if(score>=200){
v.push_back(node{s,score,-1,-1,0});
idx[s]=cnt++;
}
}
for(int i=0;i<m;i++){ //gm
cin>>s>>score;
if(idx[s]!=0) v[idx[s]-1].gm=score;
}
for(int i=0;i<n;i++){ //gf
cin>>s>>score;
if(idx[s]!=0){
int tmp=idx[s]-1;
v[tmp].gf=v[tmp].g=score;
if(v[tmp].gm>v[tmp].gf)
v[tmp].g=int(v[tmp].gm*0.4+v[tmp].gf*0.6+0.5);
}
}
for(int i=0;i<v.size() ;i++)
if(v[i].g>=60) ans.push_back(v[i]);
sort(ans.begin() ,ans.end() ,cmp);
for(int i=0;i<ans.size() ;i++)
printf("%s %d %d %d %d\n",ans[i].name.c_str(),ans[i].gp,ans[i].gm,ans[i].gf,ans[i].g);
return 0;
}