• PAT:1080. Graduate Admission (30) AC


    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    
    struct Student
    {
      int GE,GI,sum,rank,ID;
      int prefer[6];
    }STU[40066];
    
    struct School
    {
      int want;        //各学校招生人数
      int get;        //已招到的人数
      int line;        //最后一名进来的排名线
      int queue[40066];      //已投档学生编号
    }SC[106];
    
    bool cmp(Student a,Student b)
    {
      if(a.sum!=b.sum)
        return a.sum>b.sum;
      else
        return a.GE>b.GE;
    }
    
    int main()
    {
      memset(STU,0,sizeof(STU));
      memset(SC,0,sizeof(SC));
      int n,m,k;              //n名考生,m所学校,k个志愿
      scanf("%d%d%d",&n,&m,&k);
      for(int i=0 ; i<m ; ++i)      //输入各学校招生人数
        scanf("%d",&SC[i].want);
      for(int i=0 ; i<n ; ++i)
      {
        scanf("%d %d",&STU[i].GE, &STU[i].GI);    //填入分数
        STU[i].sum=STU[i].GE+STU[i].GI;        //填入总分
        STU[i].ID=i;                //填入编号
        for(int j=0 ; j<k ; ++j)
        {
          int tmp=-1;
          scanf("%d",&tmp);      //填入志愿
          STU[i].prefer[j]=tmp;
        }
      }
      sort(STU,STU+n,cmp);
      STU[0].rank=1;
      for(int i=1 ; i<n ; ++i)            //填入排序
      {
        if(STU[i].sum==STU[i-1].sum && STU[i].GE==STU[i-1].GE)
          STU[i].rank=STU[i-1].rank;
        else
          STU[i].rank=i+1;
      }
      //学生志愿为导向
      for(int i=0 ; i<n ; ++i)
      {
        for(int j=0 ; j<k ; ++j)      //STU[i].prefer[j]代表考生的j号志愿学校代码
        {
          if(SC[STU[i].prefer[j]].want>SC[STU[i].prefer[j]].get ||  SC[STU[i].prefer[j]].line==STU[i].rank )  //该校未招满或者已招满但考生排名和最后一个找入学生一样
          {
          SC[STU[i].prefer[j]].queue[SC[STU[i].prefer[j]].get]=STU[i].ID;        //考生i的ID入档
            ++SC[STU[i].prefer[j]].get;              //入档学生数+1
            SC[STU[i].prefer[j]].line=STU[i].rank;          //更新最后名次
        break;      //已被录取
          }
        }
      }
      //输出
      for(int i=0 ; i<m ; ++i)
      {
        sort(SC[i].queue,SC[i].queue+SC[i].get);    //最后升序排列
        for(int j=0 ; j<SC[i].get ;++j)
        {
          printf("%d",SC[i].queue[j]);
          if(j!=SC[i].get-1)
            printf(" ");
        }
        printf("
    ");
      }
      return 0;
    }
  • 相关阅读:
    centos 修改语言、时区
    去除 ufeff
    Docker介绍及使用
    消息队列
    数据结构与算法
    Haystack
    Python面向对象之魔术方法
    关于Redis处理高并发
    Redis
    RESTful规范
  • 原文地址:https://www.cnblogs.com/Evence/p/4320566.html
Copyright © 2020-2023  润新知