您的位置:首页 > 其它

九度题目1005:Graduate Admission

2016-05-26 15:08 155 查看
May 26, 2016

作者:dengshuai_super

出处:http://blog.csdn.net/dengshuai_super/article/details/51507509

声明:自由转载,转载请注明作者及出处。

题目1005:Graduate Admission

题目描述:

It is said that in 2011, there are about 100 graduate schools ready to proceed over 40,000 applications in Zhejiang Province. It would help a lot if you could write a program to automate the admission procedure.
Each applicant will have to provide two grades: the national entrance exam grade GE, and the interview grade GI. The final grade of an applicant is (GE + GI) / 2. The admission rules are:

• The applicants are ranked according to their final grades, and will be admitted one by one from the top of the rank list.
• If there is a tied final grade, the applicants will be ranked according to their national entrance exam grade GE. If still tied, their ranks must be the same.
• Each applicant may have K choices and the admission will be done according to his/her choices: if according to the rank list, it is one's turn to be admitted; and if the quota of one's most preferred shcool is not exceeded, then one will be admitted to this school, or one's other choices will be considered one by one in order. If one gets rejected by all of preferred schools, then this unfortunate applicant will be rejected.
• If there is a tied rank, and if the corresponding applicants are applying to the same school, then that school must admit all the applicants with the same rank, even if its quota will be exceeded.


输入:

Each input file may contain more than one test case.
Each case starts with a line containing three positive integers: N (≤40,000), the total number of applicants; M (≤100), the total number of graduate schools; and K (≤5), the number of choices an applicant may have.
In the next line, separated by a space, there are M positive integers. The i-th integer is the quota of the i-th graduate school respectively.
Then N lines follow, each contains 2+K integers separated by a space. The first 2 integers are the applicant's GE and GI, respectively. The next K integers represent the preferred schools. For the sake of simplicity, we assume that the schools are numbered from 0 to M-1, and the applicants are numbered from 0 to N-1.


输出:

For each test case you should output the admission results for all the graduate schools. The results of each school must occupy a line, which contains the applicants' numbers that school admits. The numbers must be in increasing order and be separated by a space. There must be no extra space at the end of each line. If no applicant is admitted by a school, you must output an empty line correspondingly.


样例输入:

//N(≤40,000)申请人的总数; M(≤100)研究生院的总数;
11 6 3         //和K(≤5)一个申请人可能的选择的学校的数量。
2 1 2 2 2 3    //有M个正整数,第i个整数分别是第i个研究生院的名额
100 100 0 1 2  //然后,N行跟进,每行2 + K个整数,用空格隔开
60 60 2 3 5    //前2个整数分别是申请人的GE和GI。 在下面k个整数代
100 90 0 3 4   //表的首选学校。我们假设学校被编号从0到M-1,
90 100 1 2 0   //和本申请人的编号从0到N-1。
90 90 5 1 3
80 90 1 0 2
80 80 0 1 2
80 80 0 1 2
80 70 1 3 2
70 80 1 2 3
100 100 0 2 4


样例输出:

//每所学校的结果必须占据一行,其中包含了学校编号和被
//录取的申请人的数字编号
0 10
3
5 6 7    //该数字必须是递增的顺序并用空格隔开
2 8
//如果没有申请人被学校录取,你必须相应的输出一个空行
1 4


代码如下:

/*****************************************************************************
*   九度题目1005:Graduate Admission
******************************************************************************
*   by Deng shuai May 26 2016
*   http://blog.csdn.net/dengshuai_super ******************************************************************************
*   Copyright (c) 2016, Deng Shuai
*   All rights reserved.
*****************************************************************************/

#include<iostream>
#include<map>
#include<algorithm>
#include<vector>
using namespace std;
typedef struct
{
int GE,GI;
int wanted[5];//学生想去的学校编号
} student;

map<int,student> info;
int compare(int a,int b);
int main()
{
int N,M,K;//N:学生数;M:学校数;K:学生的志愿学校数。
while(cin>>N>>M>>K)
{
int num[100];//记录学校的名额
int rank[40000];//记录学生的排名
int temp;//想去的学校
vector<vector<int> > ivec(M);
for(int i=0;i<N;i++)
rank[i]=i;//先将学生的排名按照自己的序号初始化

for(int i=0;i<M;i++)
cin>>num[i];//第i个研究生院的名额

for(int i=0;i<N;i++)
{
cin>>info[i].GE>>info[i].GI;//输入第i个学生的GE和GI成绩
for(int j=0;j<K;j++)
cin>>info[i].wanted[j];//输入第i个学生的想去的K个学校的编号
}

//录取名次排名
for(int i=0;i<N;i++)
for(int j=i+1;j<N;j++)
if(compare(rank[j],rank[i])==1) swap(rank[i],rank[j]);//执行后,rank[i]为学生i的排名

//录取过程
for(int i=0;i<N;i++)
for(int j=0;j<K;j++)
{
temp=info[rank[i]].wanted[j];
if(ivec[temp].size()<num[temp]) {ivec[temp].push_back(rank[i]);break;}
if(ivec[temp].size()>=num[temp])
{
int last=*(ivec[temp].end()-1);
if(compare(last,rank[i])==0) {ivec[temp].push_back(rank[i]);break;}
else continue;
}//if
}//for

//排序并输出
for(int i=0;i<M;i++)
{
if(ivec[i].size()==0) cout<<endl;
else
{
sort(ivec[i].begin(),ivec[i].end());
for(vector<int>::iterator iter=ivec[i].begin();iter!=ivec[i].end();iter++)
if(iter!=--ivec[i].end()) cout<<*iter<<" ";
else cout<<*iter<<endl;
}//else
}//for

}//while
return 0;
}//main

//比较a,b两个学生的成绩,如果按照规则a的排名靠前,则返回1;两人并列排名返回0;b排名靠前返回-1.
int compare(int a,int b)
{
if(info[a].GE+info[a].GI>info[b].GE+info[b].GI) return 1;
if(info[a].GE+info[a].GI<info[b].GE+info[b].GI) return -1;
if(info[a].GE+info[a].GI==info[b].GE+info[b].GI&&info[a].GE>info[b].GE) return  1;
if(info[a].GE+info[a].GI==info[b].GE+info[b].GI&&info[a].GE<info[b].GE) return -1;
if(info[a].GE+info[a].GI==info[b].GE+info[b].GI&&info[a].GE==info[b].GE) return 0;
}


运行截图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: