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

猜你喜欢

转载自blog.csdn.net/weixin_42240667/article/details/108372161