题目链接:点击查看
题目大意:分别给出a个学生的编程分数,b个学生的期中考试成绩,c个学生的期末考试成绩,有几个规则:
- 总评为:
- 若期中考试成绩大于期末考试成绩:

- 否则:

- 若期中考试成绩大于期末考试成绩:
- 合格的定义是编程分数大于等于200并且总评四舍五入后大于等于60
- 排序的优先级是:
- 先按总评排序
- 再按学号排序
满足以上规则的情况下,从大到小输出合格的学生信息
题目分析:思路简单的一道模拟题,就因为这个题目将学号变为了字符串就上升了一个难度,如果是四位或五位的数字的话我们可以直接开结构体然后储存信息,但既然学号变为了字符串,我们就不得不用map映射到结构体上,最后从map导出到vector中方便排序,最后就可以直接输出了,思路简单,但实现起来有点乱(指的是代码看起来比较乱),但身为stl依赖症患者,表示写起来非常顺畅
有个小细节需要注意一下,题目要求合格的人是在四舍五入后大于等于60的人,也就是说一个学生考了59.9分,也是算入合格的名单中的(emmm?如果现实真这样该多好啊),这个小细节对应着测试点3,我们只需要在结构体储存总评的时候用int储存就行了,在计算时四舍五入就是(int)(a+0.5),就行了
然后还有一个小细节,我注意到了但不知道这个题有没有故意挖坑,那就是期中考试和期末考试得了0分的人,本来我是直接想判断一下期中考试的分数是否为0来判断一个人是否参加过期中考试来着,但因为考虑到了这个细节,就增加了两个布尔变量用于判断该学生是否参加了期中以及期末考试,还有就是在编程分数那里可以稍微剪一下枝,就是如果编程分数低于200分的同学就不用再进行后续操作了
大概就是这样,直接上代码了:
#include<iostream> #include<cstdlib> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> #include<unordered_map> using namespace std; typedef long long LL; const int inf=0x3f3f3f3f; const int N=1e5+100; struct Node { bool flag;//期中 bool flag2;//期末 int pro;//编程 int mid;//期中 int fin;//期末 int all;//总评 Node()//初始化 { flag=flag2=false; pro=mid=fin=0; all=0; } }; map<string,Node>mp; bool cmp(pair<string,Node> a,pair<string,Node> b) { if(a.second.all!=b.second.all) return a.second.all>b.second.all; return a.first<b.first; } int main() { // freopen("input.txt","r",stdin); int a,b,c; scanf("%d%d%d",&a,&b,&c); while(a--) { string s; int num; cin>>s>>num; if(num<200)//剪枝 continue; mp[s].pro=num; } while(b--) { string s; int num; cin>>s>>num; if(!mp[s].pro)//剪枝 continue; mp[s].mid=num; mp[s].flag=true; } while(c--) { string s; int num; cin>>s>>num; if(!mp[s].pro)//剪枝 continue; mp[s].fin=num; mp[s].flag2=true; } vector<pair<string,Node>>ans; copy(mp.begin(),mp.end(),back_inserter(ans));//从map扔到vector里 for(int i=0;i<ans.size();i++) { if(ans[i].second.flag&&ans[i].second.mid>ans[i].second.fin)//参加过期中考试 ans[i].second.all=(int)(0.4*ans[i].second.mid+0.6*ans[i].second.fin+0.5); else ans[i].second.all=ans[i].second.fin; } sort(ans.begin(),ans.end(),cmp);//按照规则排序 for(int i=0;i<ans.size();i++) { if(ans[i].second.all<60)//若总评不及格,及时跳出 break; printf("%s %d %d %d %d\n",(ans[i].first).c_str(),(ans[i].second).pro,(ans[i].second).flag?(ans[i].second).mid:-1,(ans[i].second).flag2?(ans[i].second).fin:-1,(ans[i].second).all); } return 0; }
来源:https://blog.csdn.net/qq_45458915/article/details/102755133

