It is said that in 2013, there were 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:
Input Specification:
Each input file contains 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.
Output Specification:
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.
Sample Input:11 6 3 2 1 2 2 2 3 100 100 0 1 2 60 60 2 3 5 100 90 0 3 4 90 100 1 2 0 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 4Sample Output:
0 10 3 5 6 7 2 8 1 4
想到的方法是用multimap,没有直接去算排名,而是直接用成绩map到学生编号,想法是很好的,结果却因为用这个导致了一些问题,解决起来比较麻烦,没有AC。图书馆要闭馆了,今天一天也累了,暂时把这个问题放下,重在思路,日后再想想其他的方法吧,嘿嘿
#include<iostream> #include<vector> #include<map> using namespace std; struct Student { int ID; int Ge; int Gi; vector<int>vecChoice; Student(){ ID = 0; Ge = 0; Gi = 0; vecChoice.clear(); } }*student; int main() { int numStu, numSch, choice,quo,sch; multimap<int, int> scoreToID;//分数到学生ID的映射 multimap<int, int>schToStu;//学校录取结果,学校到录取学生的映射 scanf("%d%d%d", &numStu, &numSch, &choice); int *quota = new int[numSch]; student = new Student[numStu]; bool *visited = new bool[numSch]; for (int i = 0; i < numSch; ++i) { scanf("%d",&quo); quota[i] = quo; visited[i] = false; } for (int i = 0; i < numStu; ++i) { student[i].ID = i; scanf("%d%d",&student[i].Ge,&student[i].Gi); //scoreToID.insert(make_pair((student[i].Ge + student[i].Gi) / 2, student[i].ID)); scoreToID.insert(make_pair((student[i].Ge + student[i].Gi) / (-2), student[i].ID)); for (int j = 0; j < choice; ++j) { scanf("%d",&sch); student[i].vecChoice.push_back(sch); } } //multimap<int, int>::reverse_iterator riter; //for (riter = scoreToID.rbegin(); riter != scoreToID.rend(); ++riter) multimap<int, int>::iterator riter; for (riter = scoreToID.begin(); riter != scoreToID.end(); ++riter) { for (int i = 0; i < student[riter->second].vecChoice.size(); ++i) { //判断选择的学校是否招满 if (schToStu.count(student[riter->second].vecChoice[i]) < quota[student[riter->second].vecChoice[i]]) { //multimap<int, int>::iterator titer = scoreToID.find(riter->first); schToStu.insert(make_pair(student[riter->second].vecChoice[i],riter->second)); break; } //处理排名相同但是录取名额已满的情况 else { multimap<int, int>::iterator fiter = schToStu.find(student[riter->second].vecChoice[i]); for (int j = 0; j < schToStu.count(student[riter->second].vecChoice[i]); ++j, ++fiter) { //判断当前处理学生与已录取的学生是否排名相同,总分相同并且GE相同 if (((student[fiter->second].Ge + student[fiter->second].Gi) == (student[riter->second].Ge + student[riter->second].Gi)) && (student[fiter->second].Ge == student[fiter->second].Ge)) { schToStu.insert(make_pair(student[riter->second].vecChoice[i], riter->second)); break; } } } } } multimap<int, int>::iterator ptiter; int count = 0; for (ptiter = schToStu.begin(); ptiter != schToStu.end(); ++ptiter) { while (count < ptiter->first) { cout << endl; ++count; } if (visited[ptiter->first]) continue; visited[ptiter->first] = true; multimap<int, int>::iterator titer = schToStu.find(ptiter->first); if (schToStu.count(ptiter->first) == 0) cout << endl; for (int i = 0; i < schToStu.count(ptiter->first); ++i) { cout << titer->second << " "; ++titer; } cout << endl; ++count; } while (count < numSch) { cout << endl; ++count; } return 0; }
结果(大体是对的,还有些问题):