1080 Graduate Admission (30 分)

该博客介绍了一个学生录取算法的实现,包括使用结构体数组存储学生信息,利用向量进行排序,并通过算法分配学生到各学校,确保按成绩从高到低录取,同时处理了学校名额限制及同分学生的选择问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2019年2月8日

22:24

1.一个数组存学习名额

2.一个结构体数组存学生信息

3.排序

4.从高到低选择,名额减一,二维数组记录信息,如果学校名额变为0,记录最后一个学生信息(结构体数组),要是排名一样学生选择,任然计入

#include <iostream>

#include <vector>

#include <algorithm>

#include <cstdio>

using namespace std;

typedef struct P

{

    double Ge, Gi, Gf;

    int ch[10];

    int c, y;

    int pm;

}P;

P x, z[105];

vector<P> p;

vector<int> m, cho[105];

bool cmp(P a, P b)

{

    if(a.Gf != b.Gf)

        return a.Gf > b.Gf;

    else

        return a.Ge > b.Ge;

}

int cap(P a, P b)

{

    if(a.Gf == b.Gf && a.Ge == b.Ge)

        return 0;

    return -1;

}

int main()

{

    int N, M, K, a;

    while(cin >> N >> M >> K)

    {

        for(int i = 0; i < M; i++)

        {

            scanf("%d" ,&a);

            m.push_back(a);

        }

        for(int i = 0; i < N; i++)

        {

            x.y = i;

            scanf("%lf%lf", &x.Ge, &x.Gi);

            x.Gf = (x.Ge + x.Gi) / 2;

            for(int j = 0; j < K; j++)

                scanf("%d", &x.ch[j]);

            x.c = -1;

            p.push_back(x);

        }

        sort(p.begin(), p.end(), cmp);

        for(int i = 0; i < N; i++)

        {

            //cout << p[i].Gf << endl;

            for(int j = 0; j < K; j++)

            {

                int cc = p[i].ch[j];

                if(m[cc] > 0)

                {

                    m[cc]--;

                    cho[cc].push_back(p[i].y);

                    p[i].c = cc;

                    z[cc] = p[i];

                    break;

                }

                else if(m[cc] == 0)

                {

                    if(cap(z[cc], p[i]) == 0)

                    {

                        cho[cc].push_back(p[i].y);

                        p[i].c = cc;

                        z[cc] = p[i];

                        break;

                    }

                }

            }

        }

        for(int i = 0; i < M; i++)

        {

            sort(cho[i].begin(), cho[i].end());

            for(int j = 0; j < cho[i].size(); j++)

            {

                if(j != 0)

                    printf(" ");

                printf("%d", cho[i][j]);

                //printf(" ");

            }

            cout << endl;

        }

    }

    return 0;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值