其他分享
首页 > 其他分享> > PAT甲级——A1080 Graduate Admission

PAT甲级——A1080 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 G​E​​, and the interview grade G​I​​. The final grade of an applicant is (. The admission rules are:

Input Specification:

Each input file contains one test case.

Each case starts with a line containing three positive integers: N (≤), the total number of applicants; M (≤), the total number of graduate schools; and K (≤), 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 integers separated by a space. The first 2 integers are the applicant's G​E​​ and G​I​​, 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 4

Sample Output:

0 10
3
5 6 7
2 8

1 4

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 //录取规则,排名靠前的人优先选择学校
 5 using namespace std;
 6 int N, M, K;
 7 struct Node
 8 {
 9     int id, Ge, Gt, G, rank, choice[6];
10 }node;
11 struct Sch
12 {
13     int quto;
14     vector<pair<int,int>>admin;//录取的学生id,rank
15 }sch;
16 vector<Sch>school;
17 vector<Node>applicant;
18 bool cmp(Node a, Node b)
19 {
20     if (a.G != b.G)
21         return a.G > b.G;
22     else
23         return a.Ge > b.Ge;
24 }
25 int main()
26 {
27     cin >> N >> M >> K;
28     for (int i = 0; i < M; ++i)
29     {
30         cin >> sch.quto;
31         school.push_back(sch);
32     }
33     for (int i = 0; i < N; ++i)
34     {
35         cin >> node.Ge >> node.Gt;
36         node.G = node.Ge + node.Gt;
37         node.id = i;
38         for (int j = 0; j < K; ++j)
39         {
40             int t;
41             cin >> t;
42             node.choice[j] = t;//志愿学校
43         }
44         applicant.push_back(node);
45     }
46     sort(applicant.begin(), applicant.end(), cmp);
47     applicant[0].rank = 1;
48     for (int i = 1; i < N; ++i)//排名
49     {
50         if (applicant[i].G == applicant[i - 1].G && applicant[i].Ge == applicant[i - 1].Ge)
51             applicant[i].rank = applicant[i - 1].rank;
52         else
53             applicant[i].rank = i + 1;
54     }
55     for (int i = 0; i < N; ++i)//按学生选学校
56     {
57         for (int j = 0; j < K; ++j)
58         {
59             int t = applicant[i].choice[j];
60             if (school[t].quto == 0 && (school[t].admin.end() - 1)->second == applicant[i].rank)//排名相同可以超额
61             {
62                 school[t].admin.push_back(make_pair(applicant[i].id, applicant[i].rank));//超额录取
63                 break;
64             }
65             else if (school[t].quto == 0)
66                 continue;//面试下一所学校,该学校满额
67             else
68             {
69                 school[t].admin.push_back(make_pair(applicant[i].id, applicant[i].rank));//正常录取
70                 school[t].quto--;//名额减少
71                 break;
72             }
73         }
74     }
75     for (int i = 0; i < M; ++i)
76     {
77         sort(school[i].admin.begin(), school[i].admin.end());
78         for (int j = 0; j < school[i].admin.size(); ++j)
79             cout << school[i].admin[j].first << (j == school[i].admin.size() - 1 ? "" : " ");
80         cout << endl;
81     }    
82     return 0;
83 }

 

标签:node,school,applicant,PAT,int,Admission,A1080,rank,++
来源: https://www.cnblogs.com/zzw1024/p/11326552.html