• PAT1137


    题意

    • 一个学生的成绩由上机,期中,期末共3部分构成,现要求找出有资格获得证书的同学们。
    • 证书获得者要求:上机分至少200,最终成绩及格。
    • 最终成绩的生成规则:若期中分>期末分,则f = 期中 * 0.4 + 期末 * 0.6。否则期末分就是最终成绩。
    • 注,学生某项成绩可能会缺失。

    分析

    • 学生人数可能达到3W,别以为只是1W! P+M+N<=30000。略坑,搞得我老段错误。
    • 学生可能没有分数,这得处理,分析期中和期末的情况即可。
    • 学生的最终成绩计算公式涉及浮点,直接round解决(其实题意round up 应该是上整的意思)。
    • 规则应该是没有冲突的。
    #include <iostream>
    #include <vector>
    #include <map>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    
    struct Student
    {
        string name;
        int p, m, n, f;
        Student(string name=""): name(name), p(-1), m(-1), n(-1), f(-1){};
    };
    map<string,int> mapp;
    vector<Student> students;
    
    void TestAndSet(string name)
    {
        if(mapp.find(name)==mapp.end())
        {
            mapp[name] = students.size();
            students.push_back(Student(name));
        }
    }
    
    int cmp(int a, int b)
    {
        if(students[a].f==students[b].f)
            return students[a].name < students[b].name;
        return students[a].f > students[b].f;
    }
    
    
    int main()
    {
        //freopen("input.txt", "r", stdin);
        int P,M,N;
        while(cin>>P>>M>>N)
        {
            mapp.clear();
            string name;
            char buf[32];
            int score;
    
            while(P--)
            {
                scanf("%s%d", buf, &score);
                name = buf;
                TestAndSet(name);      
                students[mapp[name]].p = score;
            }
            while(M--)
            {
                scanf("%s%d", buf, &score);
                name = buf;
                TestAndSet(name);
                students[mapp[name]].m = score;
            }
            while(N--)
            {
                scanf("%s%d", buf, &score);
                name = buf;
                TestAndSet(name);
                students[mapp[name]].n = score;
            }
            vector<int> vect;
            for(int i=0; i<students.size(); i++)
            {
                if(students[i].p<200)   continue;   // 上机分数低
                else if(students[i].n<0)    continue;   // 无期末分数
                else
                {
                    if(students[i].m<=students[i].n)
                        students[i].f = students[i].n;
                    else
                        students[i].f = round(students[i].m * 0.4 + students[i].n * 0.6);
                    if(students[i].f>59)    vect.push_back(i);
                }
            }
            sort(vect.begin(), vect.end(), cmp);
            for(int i=0; i<vect.size(); i++)
            {
                // 名字 上机 期中 期末 总分
                Student tmp = students[vect[i]];
                printf("%s %d %d %d %d
    ", 
                      tmp.name.c_str(), tmp.p, tmp.m, tmp.n, tmp.f);
            }
        }
        return 0;
    }
    
  • 相关阅读:
    socket编程之二:两种链接类型tcp和udp
    屌丝、小白怎么拿国内巨头offer
    python调用tcpdump抓包过滤
    设计模式6大原则
    Javascript中bind()方法的使用与实现
    vue-cli中的check-versions.js配置文件包括semver,chalk,shell插件的解释
    基础组件(二)
    浏览器跨域请求之credentials
    跨域资源共享 CORS 详解
    PHP从入门到精通(六)
  • 原文地址:https://www.cnblogs.com/xcw0754/p/8167420.html
Copyright © 2020-2023  润新知