题目大意:
每个学生有四个成绩,线上成绩,期中,期末,总分。现在分别给出这四门成绩下对应的学生分数情况。要求按照总分从大到小(分数相同则按照ID字典序升序)输出总分及格(>=60分)的学生成绩情况。线上成绩必须不小于200分。
解题思路:
用MAP给每名学生分配唯一的编号方便用结构体保存信息并排序,输入时对于线上成绩小于200的学生不保存。
代码如下:
#include<iostream>
#include<map>
#include<cstring>
#include<algorithm>
using namespace std;
map<string,int> s;//给每个ID编号
int p,g1,g2,inde=1;
struct stu
{
int online=-1,gt=-1,gf=-1,f;
char ids[30];
}data[11000];
int cmp(stu a,stu b)
{
if(a.f==b.f)//总分相同
{
return strcmp(a.ids,b.ids)<0;//字典序升序
}
else return a.f>b.f;
}
int main()
{
scanf("%d %d %d",&p,&g1,&g2);
for(int i=0;i<p;i++)
{
char id[30];
int score;
scanf("%s %d",id,&score);
string t=string(id);
if(score>=200)//线上课小于200的不参与排序
{
s[t]=inde;//MAP标记
data[inde].online=score;
strcpy(data[inde].ids,id);
inde++;
}
}
for(int i=0;i<g1;i++)
{
char id[30];
int score;
scanf("%s %d",id,&score);
string t=string(id);
if(s[t]!=0)
{
int cur=s[t];
data[cur].gt=score;
}
}
for(int i=0;i<g2;i++)
{
char id[30];
int score;
scanf("%s %d",id,&score);
string t=string(id);
if(s[t]!=0)
{
int cur=s[t];
data[cur].gf=score;
if(data[cur].gf>=data[cur].gt)data[cur].f=score;//计算总分
else
{
double tes=data[cur].gt*0.4+score*0.6+0.5;
data[cur].f=tes;
}
}
}
sort(data+1,data+inde+1,cmp);//下标是从1开始的
for(int i=1;i<inde;i++)
{
if(data[i].f>=60)
printf("%s %d %d %d %d\n",data[i].ids,data[i].online,data[i].gt,data[i].gf,data[i].f);
}
return 0;
}