欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

题目1005:Graduate Admission(结构体排序)

发布时间:2023/12/20 52 豆豆
生活随笔 收集整理的这篇文章主要介绍了 题目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("\n");else if(Sch[i].now==1) printf("%d\n",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("\n");}}} }

 

作者: AlvinZH

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

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

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

转载于:https://www.cnblogs.com/AlvinZH/p/6771713.html

总结

以上是生活随笔为你收集整理的题目1005:Graduate Admission(结构体排序)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。