PAT1137 Final Grading 两个测试点不通过,仔细读题

第一遍没有仔细看题目,题干中提到的最终成绩不小于60,不是指Gfinal不小于60,而是计算后的G不小于60,卡了好久了,半天没看出哪里问题,final grade 和Gfinal太误导人了

怪自己太菜了≡(▔﹏▔)≡,下面是AC代码

#include<iostream>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<unordered_map>
using namespace std;
struct student{//最终分数向上取整
    string id;
    int gp,gmid,gfinal;
    int gg;
    student(){gmid=-1;gfinal=-1;}
}st[10005];
//有个特别大的坑,最终成绩大于60,指的是G,而不是Gfinal
unordered_map<string,int> sti;//学生id到数组下标的映射
int cnt=1;
bool cmp(int a,int b)
{
    if(st[a].gg!=st[b].gg)return st[a].gg>st[b].gg;
    else return st[a].id<st[b].id;
}
int main()
{
    int p,m,n;
    cin>>p>>m>>n;
    for(int i=0;i<p;i++)
    {
        string id;
        int grade;
        cin>>id>>grade;
        if(grade>=200)//合格成绩
        {
            sti[id]=cnt++;
            st[sti[id]].id=id;
            st[sti[id]].gp=grade;
        }
    }
    for(int i=0;i<m;i++)
    {
        string id;int grade;
        cin>>id>>grade;
        if(sti[id]!=0)//存在合格的gp成绩
        {
            st[sti[id]].gmid=grade;
        }
    }
    for(int i=0;i<n;i++)
    {
        string id;int grade;
        cin>>id>>grade;
        if(sti[id]!=0)
        {
            st[sti[id]].gfinal=grade;
        }
    }
    vector<int> result;
    for(unordered_map<string,int>::iterator it=sti.begin();it!=sti.end();it++)
    {
        if(it->second!=0)
        {
            int tem=it->second;
            if(st[tem].gmid>st[tem].gfinal)st[tem].gg=(st[tem].gmid*0.4+st[tem].gfinal*0.6+0.5);
            else st[tem].gg=st[tem].gfinal;
            if(st[tem].gg>=60)
            result.push_back(it->second);
        }
    }
    sort(result.begin(),result.end(),cmp);
    for(int i=0;i<result.size();i++)
    {
        cout<<st[result[i]].id<<" "<<st[result[i]].gp<<" "<<st[result[i]].gmid<<" ";
        cout<<st[result[i]].gfinal<<" "<<st[result[i]].gg<<endl;
    }
    return 0;
}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值