1080 Graduate Admission (30分)

给定n个学生的成绩该生的k个志愿院校,m个学校的招生人数,求每个学校的录取情况。
排名是按照总分排名,总分相同时比较高考成绩。(虽然final grade是说两个成绩的平均值,但是直接比较总分也一样,算平均分还可能有浮点什么的问题)如果某个学生被某意向院校录取,那和他同分的学生也必被录取无论该院校名额是否已满。

先读入,然后给学生排序,查看每个学生的意向院校,如果该院校名额还没满或者满了但是最后一名和该生同分,都将该生加入该院校对应的vector中。然后输出的时候再按照id重新排下序。

刚开始牛客网用例全过了,pat还卡着两个点段错误,找了半天是不是哪里非法访问了,后来才发现重载的<有个分支没给返回值……(真狠啊两个点没过就只有八分)

#include <stdio.h>
#include <vector>
#include <set>
#include <algorithm>
#include <math.h>

using namespace std;
int n,m,k;
struct Node{
    int id=-1,ge,gi;
    int preferSc[5];
    friend bool operator <(Node a,Node b){
        if(a.ge+a.gi!=b.ge+b.gi) return a.ge+a.gi>b.ge+b.gi;
        else return a.ge>b.ge;//这里如果写else if(a.ge!=b.ge)return xxx的话会造成两个ge相等时没有返回值,会造成runtime error/segment fault
    }
};
vector<Node> v;
int quota[105];
vector<Node> admitLis[105];
int main() {
    scanf("%d %d %d",&n,&m,&k);

    for(int i=0;i<m;i++){
        scanf("%d",&quota[i]);
    }
    for(int i=0;i<n;i++){
        int add,key,next;
        Node node;
        node.id=i;
        scanf("%d%d",&node.ge,&node.gi);
        for(int j=0;j<k;j++){
            scanf("%d",&node.preferSc[j]);
        }
        v.push_back(node);
    }
    sort(v.begin(),v.end());
    for(int i=0;i<v.size();i++){
        for(int j=0;j<k;j++){
            Node lastn;
            if(quota[v[i].preferSc[j]]!=0 && admitLis[v[i].preferSc[j]].size()!=0)lastn=admitLis[v[i].preferSc[j]][admitLis[v[i].preferSc[j]].size()-1];
            if(admitLis[v[i].preferSc[j]].size()<quota[v[i].preferSc[j]] || (lastn.id!=-1 && lastn.ge==v[i].ge && lastn.gi==v[i].gi)){
                admitLis[v[i].preferSc[j]].push_back(v[i]);
                break;
            }
        }
    }

    for(int i=0;i<m;i++){
        vector<int> res;
        for(int j=0;j<admitLis[i].size();j++){
            res.push_back(admitLis[i][j].id);
        }
        sort(res.begin(),res.end());
        for(int j=0;j<res.size();j++){
            printf("%d",res[j]);
            if(j<res.size()-1)printf(" ");
        }
        printf("\n");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值