zoukankan      html  css  js  c++  java
  • 题目1005:Graduate Admission(结构体排序)

    问题来源

      http://ac.jobdu.com/problem.php?pid=1005

    问题描述

      这道题理解题意有些麻烦,多看几遍先理解题意再说。每个学生有自己的三个成绩,一个编号,以及一个志愿列表。每个学校有自己的招生人数限制。按要求输出每所学校最后的招生情况。

    问题分析

      我们按照题目要求一个一个来。使用两个结构体分别为Student和School。

    typedef struct Student{
        int id;
        int GE;
        int GI;
        double Final;
        int choice[6];
    }Student;
    typedef struct School{
        int now;//已招人数
        int Max;//最大人数
        vector admit;
    }School;

      把所有的信息输入之后,对学生进行排序,需要重写sort函数的比较函数。
      在录取过程中,所限判断已录取人数和最大录取人数,如果都是0,那别录了直接break。(这是个坑点)
      如果人没录满,那么就录吧,如果已经录满,那么拿出前一个录取人的信息进行比较,相同也可以录进去。
      另外一个坑点在于输出格式,最后不能有空格哦~

    参考代码

    参考代码:

    //
    // Created by AlvinZH on 2017/4/27.
    // Copyright (c) AlvinZH. All rights reserved.
    //
    
    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    int n,m,k;
    typedef struct Student{
        int id;
        int GE;
        int GI;
        double Final;
        int choice[6];
    }Student;
    typedef struct School{
        int now;//已招人数
        int Max;//最大人数
        vector<int> admit;
    }School;
    
    Student Stu[40005];
    School Sch[105];
    
    bool cmp(Student a,Student b)
    {
        if(a.Final!=b.Final) return a.Final>b.Final;
        else return a.GE>b.GE;
    }
    
    int main()
    {
        while(~scanf("%d%d%d",&n,&m,&k))
        {
            for(int i=0;i<m;i++)
            {
                scanf("%d",&Sch[i].Max);
                Sch[i].now=0;
                Sch[i].admit.clear();
            }
    
            for(int i=0;i<n;i++)
            {
                Stu[i].id=i;
                scanf("%d %d",&Stu[i].GE,&Stu[i].GI);
                Stu[i].Final=(Stu[i].GE+Stu[i].GI)/2;
                for(int j=0;j<k;j++)
                    scanf("%d",&Stu[i].choice[j]);
            }
            sort(Stu,Stu+n,cmp);
    
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<k;j++)
                {
                    int quota=Stu[i].choice[j];
                    if(Sch[quota].now==0&&Sch[quota].Max==0) break;
                    else if(Sch[quota].now<Sch[quota].Max)
                    {
                        Sch[quota].now++;
                        Sch[quota].admit.push_back(i);
                        break;//已录取,退出
                    }
                    else
                    {
                        int lastone=Sch[quota].admit[Sch[quota].now-1];
                        if(Stu[lastone].GE==Stu[i].GE&&Stu[lastone].GI==Stu[i].GI)
                        {
                            Sch[quota].now++;
                            Sch[quota].admit.push_back(i);
                            break;//已录取,退出
                        }
                    }
                }
            }
    
            for(int i=0;i<m;i++)//实际ID还原
                for(int j=0;j<Sch[i].now;j++)
                    Sch[i].admit[j]=Stu[Sch[i].admit[j]].id;
    
            for(int i=0;i<m;i++)
            {
                if(Sch[i].now==0) printf("
    ");
                else if(Sch[i].now==1) printf("%d
    ",Sch[i].admit[0]);
                else
                {
                    sort(Sch[i].admit.begin(),Sch[i].admit.end());
                    int flag = 1;
                    for(int j=0;j<Sch[i].now;j++)
                    {
                        if(flag) flag=0;
                        else printf(" ");
    
                        printf("%d",Sch[i].admit[j]);
                    }
                    printf("
    ");
                }
            }
        }
    }

    作者: AlvinZH

    出处: http://www.cnblogs.com/AlvinZH/

    本人Github:https://github.com/Pacsiy/JobDu

    本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

  • 相关阅读:
    Python面向对象:杂七杂八的知识点
    初学Python常见异常错误,总有一处你会遇到!
    Python GUI开发,效率提升10倍的方法!
    Python里三个最高逼格的调试神器
    你见过的最全面的 Python 重点
    Python使用数字与字符串的技巧
    python3的eval和exec的区别与联系
    Python规范:提高可读性
    mysql使用mysqldump和crontab定时备份
    spring cloud stream集成rabbitmq
  • 原文地址:https://www.cnblogs.com/AlvinZH/p/6771713.html
Copyright © 2011-2022 走看看