PAT 甲级 1080 Graduate Admission

本文详细介绍了PAT甲级考试中的1080题,重点探讨了研究生入学考试的相关内容,包括考试结构、难点解析及备考策略。
摘要由CSDN通过智能技术生成

PAT 甲级 1080 Graduate Admission

#include<bits/stdc++.h>
using namespace std;
int N, M, K;
struct Student
{
    int id_;
    int grade_e_;
    int grade_i_;
    double final_grade_;
    int rank_;
    vector<int> school_want_to_go_;
};
bool cmp(const Student &lhs, const Student &rhs)
{
    if (abs(lhs.final_grade_ - rhs.final_grade_) > 1e-6) {
        return lhs.final_grade_ - rhs.final_grade_ > 1e-6;
    }
    if (lhs.grade_e_ != rhs.grade_e_) {
        return lhs.grade_e_ > rhs.grade_e_;
    }
    return lhs.id_<rhs.id_;
}
int main()
{
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
#endif
    cin >> N >> M >> K;
    //学校还可以录取的人数
    vector<int> school_quota(M);
    for (auto &i : school_quota) cin >> i;
    vector<Student> all_student(N);
    //输入学生数据
    for (int i = 0; i < N; ++i) {
        all_student[i].id_ = i;
        cin >> all_student[i].grade_e_ >> all_student[i].grade_i_;
        all_student[i].school_want_to_go_ = vector<int>(K);
        for (auto &j: all_student[i].school_want_to_go_){
            cin >> j;
        }
        all_student[i].final_grade_ = (all_student[i].grade_e_ + all_student[i].grade_i_) / 2;
    }
    //排序
    sort(all_student.begin(), all_student.end(), cmp);
    int rank_ctr = -1;
    for (int i = 0; i < all_student.size(); ++i) {
        if (i == 0) all_student[i].rank_ = ++rank_ctr;
        else if (abs(all_student[i].final_grade_ - all_student[i - 1].final_grade_) < 1e-6
            && all_student[i].grade_e_ == all_student[i - 1].grade_e_) {
            all_student[i].rank_ = rank_ctr;
        }
        else {
            all_student[i].rank_ = ++rank_ctr;
        }
    }
    //创建一个录取序列
    vector<vector<Student>> luqu(rank_ctr+1);
    for (auto &i : all_student) {
        luqu[i.rank_].push_back(i);
    }

   /* for (auto i : luqu) {
        for (auto j : i) {
            cout << j.final_grade_ << " " << j.id_ << " "
                << j.grade_e_ << " " << j.grade_i_ << " " << j.rank_ << endl;
        }
        cout << endl;
    }*/
    //创建学校序列进行录取
    vector<vector<int>> school_set(M);
    for (auto &this_turn : luqu) {
        //为了处理相同录取的情况,在一轮录取完成之后才把本轮录取人数加到学校已录取人数上面。
        vector<int> school_admit_this_turn(M,0);
        for (auto &this_student : this_turn) {
            for (auto &school_wannnt : this_student.school_want_to_go_) {
                //当学校没有录满的时候录入
                if (school_quota[school_wannnt] > 0) {
                    school_admit_this_turn[school_wannnt]++;
                    school_set[school_wannnt].push_back(this_student.id_);
                    break;
                }
            }
        }
        //这一轮之后,school_quota减去已经录取的人数。
        for (int i = 0; i < M; ++i) {
            school_quota[i] -= school_admit_this_turn[i];
        }
    }
    //输出前按照序号排序
    for (auto &i : school_set) {
        sort(i.begin(), i.end());
    }
    //输出
    for (auto &i : school_set) {
        for (int j = 0; j < i.size(); ++j) {
            if (j != 0) cout << " ";
            cout << i[j];
        }
        cout << endl;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值