目的:整合分数生成最终分数
输入:
P 做过在线平台测试的学生人数
M 期中考试的人数
N 期末考试人数
所以人数不超过10000
然后是三个部分分数数据包
格式:
学生id 分数
id不超过20位的字符串
分数是非负整数,在线测试是小于等于900,其余是100;
输出:
输出每个合格的测评学生,合格标准,Gp大于等于200,总分不小于60.
格式:
学生id Gp Gmid-term Gfinal G
如果一些分数不存在,该位置输出-1
输出按照最终分数从高到低排序。G向上取整。
如果有分数一样的,按照id从小到大排序。
算法:
名字肯定用string存,所以用map比较好,或者unordered_map,。
分三个map存,再用一个vector,最后存合格的人的最终分数和名字。
#include<stdio.h>
#include<iostream>
#include<unordered_map>
#include<vector>
#include<algorithm>
#include<string>
#include<cmath>
using namespace std;
struct node{
string id;
int G;
} temp;
int P,M,N;
unordered_map<string,int> Gp,Gmid,Gfinal;
vector<node> ans;
bool cmp(node a,node b)
{
if(a.G!=b.G)
{
return a.G>b.G;
}else
{
return a.id<b.id;
}
}
int main()
{
scanf("%d%d%d",&P,&M,&N);
for(int i=0;i<P;i++)
{
string name;
int score;
cin>>name>>score;
if(Gp[name]==0)
{
Gmid[name] = -1;
Gfinal[name] = -1;
}
Gp[name] = score;
}
for(int i=0;i<M;i++)
{
string name;
int score;
cin>>name>>score;
if(Gmid[name]==0)
{
Gp[name] = -1;
Gfinal[name] = -1;
}
Gmid[name] = score;
}
for(int i=0;i<N;i++)
{
string name;
int score;
cin>>name>>score;
if(Gfinal[name]==0)
{
Gmid[name] = -1;
Gp[name] = -1;
}
Gfinal[name] = score;
}
for(unordered_map<string,int>::iterator it = Gp.begin();it!=Gp.end();it++)
{
string id = it->first;
if(Gp[id]>=200)
{
int g;
if(Gmid[id]>Gfinal[id])//参加了期中考试
{
g =(int)(Gmid[id]*0.4+Gfinal[id]*0.6+0.5);
}else
{
g = Gfinal[id];
}
if(g>=60)
{
temp.id = id;
temp.G = g;
ans.push_back(temp);
}
}
}
sort(ans.begin(),ans.end(),cmp);
for(int i=0;i<ans.size();i++)
{
cout<<ans[i].id;
string name = ans[i].id;
printf(" %d %d %d %d\n",Gp[name],Gmid[name],Gfinal[name],ans[i].G);
}
return 0;
}
反思:是四舍五入,不是向上取整。而且。必须要有实验成绩,不然作废。