
题目大意:
题目中给了评定最终分数的机制:
- 首先需要获得200个程序得分点
- 如果期中成绩大于期末成绩,就用期中成绩0.4+期末成绩0.6来计算;否则直接把期末成绩作为最终成绩
题目中分别给出三个量p,m,n.
首先会给出p个学生做的在线编程的分数;紧接着是m个学生的期中成绩;最后是n个学生的期末成绩;
如果有些成绩没有的话,就输出-1.
思路:
首先在输入P个在线编码成绩时,就可以把低于200分的不进行录入,只存储200及以上的。
由于最后对于整个结果需进行多个条件的评判,所以在前面要用到结构体。该结构体里的属性为最终成绩和studentID,mid-term和final-term,point(所有成绩初始化为-1)
排序的话用一个动态数组对结构体进行存储
后续在编写代码中发现了一个点:如果一个个找student是否在需计算的队列里的话用循环太费时间了,所以选取了map先存储这些值,用find()函数来看是否在这个范围里。
然后最后把值从map传到vector时,同时计算final grade,这里final grade要不少于60;
代码:
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<unordered_map>
#include<cmath>
using namespace std;
struct student{
string studentid;
int point,mid,fexam,final;
};
bool cmp(student s1,student s2){
return s1.final==s2.final?s1.studentid<s2.studentid:s1.final>s2.final;
}
int main(){
int p,m,n;
cin>>p>>m>>n;
vector<student> v;
unordered_map<string,student> ms;
while(p--){
string stu;
int point;
cin>>stu>>point;
if(point>=200){
student s={stu,point,-1,-1,-1};
ms[stu]=s;
}
}
while(m--){
string stu;
int mid;
cin>>stu>>mid;
if(ms.find(stu)!=ms.end()) ms[stu].mid=mid;
}
while(n--){
string stu;
int fexam;
cin>>stu>>fexam;
if(ms.find(stu)!=ms.end()) ms[stu].fexam=fexam;
}
for(auto it=ms.begin();it!=ms.end();it++){
if(it->second.mid>it->second.fexam) it->second.final=round(it->second.mid*0.4+it->second.fexam*0.6);
else it->second.final=it->second.fexam;
if(it->second.final>=60) v.push_back(it->second);
}
sort(v.begin(),v.end(),cmp);
for(int i=0;i<v.size();i++) printf("%s %d %d %d %d\n",v[i].studentid.c_str(),v[i].point,v[i].mid,v[i].fexam,v[i].final);
return 0;
}

精华
- map里找元素:if(ms.find(stu)!=ms.end())
本文介绍了一种编程成绩评定算法,该算法根据在线编程得分、期中期末考试成绩等信息综合评定学生的最终成绩,并通过结构体存储和排序实现高效计算。

906

被折叠的 条评论
为什么被折叠?



