• 1075 PAT Judge (25 分)


    带模拟。

    题意

    有N位考生,共有K道题,且每道题的分值给出。然后给出M次提交记录,每个提交记录显示了该次提交所属考生的准考证号、交题的题号及所得的分值,其中分值要么是-1 (表示未通过编译),要么是0到该题满分区间的一个整数。现在要求对所有考生按下面的规则排序:

    1. 先按K道题所得总分从高到低排序。
    2. 若总分相同,则按完美解决(即获得题目满分)的题目数量从高到低排序。
    3. 若完美解决的题目数量也相同,则按准考证号从小到大排序。

    输出规则:

    1. 输出每位考生的排名、准考证号、总分、K道题的各自得分,若总分相等,则排名相同。
    2. 如果某位考生全场都没有提交记录,或是没有能通过编译的提交,则该考生的信息不输出。
    3. 对需要输出的考生,如果某道题没有能通过编译的提交,则将该题记为0分;如果某道题没有提交记录,则输出'-'。

    思路

    为了能区分“全场都没有提交”“没有能通过编译的提交”以及“有能通过编译的提交”三种情况,同时处理需要输出的考生的未通过编译的题记为0分的情况,不妨将每个考生的数组grade[]初始化为-2,来表示该题没有提交。于是对每个提交记录,就可以得到如下处理方式(按顺序执行):

    1. 如果当前提交能通过编译,则令该考生的shown为true,表示有能通过编译的提交。
    2. 如果当前提交使该考生获得该题的更高分数,则将这个分数覆盖到已有记录上。

    所有提交记录处理完毕后,把需要输出的每个考生的总分和完美解题数计算出来,再进行排序。

    最后一步输出需要输出的考生信息。其中,只要某题的得分为-2,则表示该题没有提交,需要输出'-'。

    int p[10];
    int n,k,m;
    struct Node
    {
        string id;
        int grade[10];
        int sum;
        int solve;
        int rank;
        bool shown;
        Node(){}
        Node(string _id):id(_id)
        {
            for(int i=1;i<=k;i++) grade[i]=-2;
            sum=solve=shown=rank=0;
        }
    
        bool operator<(const Node &W) const
        {
            if(sum != W.sum) return sum > W.sum;
            if(solve != W.solve) return solve > W.solve;
            return id < W.id;
        }
    };
    map<string,Node> mp;
    
    int main()
    {
        cin>>n>>k>>m;
    
        for(int i=1;i<=k;i++) cin>>p[i];
    
        while(m--)
        {
            string id;
            int problem_id,score;
            cin>>id>>problem_id>>score;
    
            if(!mp.count(id)) mp[id]=Node(id);
            mp[id].grade[problem_id]=max(mp[id].grade[problem_id],score);
    
            if(score != -1) mp[id].shown=true;
        }
    
        vector<Node> res;
        for(auto t:mp)
        {
            if(t.se.shown)
            {
                for(int i=1;i<=k;i++)
                {
                    t.se.sum+=max(0,t.se.grade[i]);
                    if(t.se.grade[i] == p[i]) t.se.solve++;
                }
                res.pb(t.se);
            }
        }
    
        sort(res.begin(),res.end());
    
        for(int i=0;i<res.size();i++)
        {
            if(i && res[i].sum == res[i-1].sum)
                res[i].rank = res[i-1].rank;
            else
                res[i].rank=i+1;
    
            cout<<res[i].rank<<' '<<res[i].id<<' '<<res[i].sum;
            for(int j=1;j<=k;j++)
                if(res[i].grade[j] == -2) cout<<" -";
                else cout<<' '<<max(0,res[i].grade[j]);
            cout<<endl;
        }
        //system("pause");
        return 0;
    }
    
  • 相关阅读:
    两种图像缩放算法的对比与实现
    字节流与字符流
    自己的网站 首都易搜网 又修改了一下。。首页改变了
    序列化和反序列化 .NET
    关于 C#异步方法的使用
    vs2010 设计视图中控件无法加载,提示未将对象设置到对象的实例。
    .Net 中的反射(查看基本类型信息) Part.2
    URL重写
    .Net 中的反射(序章) Part.1
    数据库死锁问题 及 解决方法
  • 原文地址:https://www.cnblogs.com/fxh0707/p/14407132.html
Copyright © 2020-2023  润新知