PAT a1137

目的:整合分数生成最终分数

输入:

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;
}

反思:是四舍五入,不是向上取整。而且。必须要有实验成绩,不然作废。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值