PAT甲级1137 Final Grading (25分) 测试点3过不去的问题,AC代码+注释

tech2022-07-15  153

点击进入源题

题目大意:对给出的若干考生的上机考试,期中考试,期末考试成绩进行汇总,按照一定顺序输出及格的学生。

注意点:1.及格的条件为上机考试分数不低于200分,同时总成绩不低于六十,注意,是总成绩,不是期末成绩,这 里弄错的话测试点3过不去。 2.如果使用map来实现考生名字与期中成绩的映射的话,有可能会把0分考生误认为缺考,毕竟访问不存 在的Key时默认的初值就是0;这里出错测试点3也过不去; 3.总成绩用整型,取整的方式时rounded up 要记得四舍五入; #include <iostream> #include <map> #include <vector> #include <algorithm> #include <cstring> #include <set> using namespace std; struct node{ string name; int online,mid,final,all; }; int cmp(node a,node b){ if(a.all!=b.all) return a.all>b.all; else return a.name<b.name; } map<string ,int> online,mid,final;//用map对结构体进行映射很麻烦,直接对每一个变量进行映射就好 set<string> nlist; //最后统插入到vector里面就好。 vector<node> res; int main() { int a,b,c,score; cin>>a>>b>>c; string name; for(int i=0;i<a;i++){ cin>>name>>score; online[name]=score; nlist.insert(name); } for(int i=0;i<b;i++){ cin>>name>>score; mid[name]=score; nlist.insert(name); } for(int i=0;i<c;i++){ cin>>name>>score; final[name]=score; nlist.insert(name); } for(auto i:nlist){ if(online[i]<200) continue; int all,mids; if(mid.find(i)!=mid.end()) //这里用map.find(key)就不会把0分人的情况忽略了。 mids=mid[i]; else mids=-1; if(mids>final[i]) all=(int)(mids*0.4+final[i]*0.6+0.5);//只要+个0.5再取整就可以实现四舍五入,属实方便~ else all=final[i]; if(all<60) continue; res.push_back({i,online[i],mids,final[i],all}); } sort(res.begin(),res.end(),cmp); for(auto i:res){ printf("%s %d %d %d %d\n",i.name.c_str(),i.online,i.mid,i.final,i.all); } return 0; }

这里稍微提一下mid.find(i)!=mid.end()是怎么判断key是否存在的,find()返回的是一个迭代器,它从map的开头开始找key,一直找鸭找鸭找,然后它找到key就返回了,如果说key不存在于map里面的话,他就会一路找到底,返回map末端的迭代器end()。

最新回复(0)