-
Notifications
You must be signed in to change notification settings - Fork 0
/
1080.cpp
178 lines (165 loc) · 3.24 KB
/
1080.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
// 1080.cpp : 定义控制台应用程序的入口点。
//
// (面试成绩+ 笔试成绩) /2
//根据最后的成绩排名
//最后成绩相同的话,根据笔试成绩,还一样的话,相同排名
//每个申请者有K个选择
//根据排名 按选择先后选择学校,都被拒绝的话,这个申请者挂掉
//相同排名,若申请者都申请同一学校,则均被录取
//N(所有考生 M(所有研究生学校 K(一个人有几个选择
//第i个学校的名额
//Ge Gi K个学校
//输出 每个学校收入的学生结果
//无学生招入就为0
//思路
#include "stdafx.h"
#include <iostream>
#include <list>
#include <vector>
#define MAX_SCHOOL 100
#define MAX_CHOICE 5
#define MAX_APPLICATIORS 40000
using namespace std;
int num_applicator = 0;
int num_school = 0;
int K = 0;
int arrySchools[MAX_SCHOOL];
int arryApplicators[MAX_APPLICATIORS];
int Allrank = 0;
vector<list<int>> request(MAX_SCHOOL);
list<int >Need;
typedef struct
{
float G;//总分
int Ge;
int Gi;
int Choice[MAX_CHOICE];
int rank;
int number;//自己的编号
}NODE;
NODE student[MAX_APPLICATIORS];
void swap(NODE & node1, NODE &node2)
{
NODE temp;
temp = node1;
node1 = node2;
node2 = temp;
}
int main()
{
int temp_choice;
cin >> num_applicator >> num_school >> K;
cin.get();
for (int i = 0; i < num_school; i++)
{
cin >> arrySchools[i];
}
cin.get();
for (int i = 0; i < num_applicator; i++)
{
//接收每个学生
cin >> student[i].Ge >> student[i].Gi;
for (int j = 0; j < K; j++)
{
cin >> student[i].Choice[j];
}
cin.get();
student[i].number = i;
student[i].G = (student[i].Ge + student[i].Gi)*1.0 / 2;
//差入排序 大数在前
for (int j = i - 1; j >= 0; j--)
{
if (student[j].G < student[j + 1].G)
{
swap(student[j], student[j + 1]);
}
else if (student[j].G == student[j+1].G)
{
if (student[j].Ge < student[j + 1].Ge)
{
swap(student[j], student[j + 1]);
}
//还等于的话相同排名
}
else
{
break;
}
}
}
for (int i = 0; i < num_applicator; i++)
{
if (i < num_applicator - 1)
{
if (student[i].G != student[i + 1].G)
{
student[i].rank = Allrank++;
}
else if (student[i].Ge != student[i + 1].Ge)
{
student[i].rank = Allrank++;
}
else
{
student[i].rank = Allrank;
}
}
else
{
if (student[i].G != student[i - 1].G)
{
student[i].rank = Allrank++;
}
else if (student[i].Ge != student[i - 1].Ge)
{
student[i].rank = Allrank++;
}
else
{
student[i].rank = Allrank;
}
}
}
//排名
for (int ran = 0,i=0; ran < Allrank; ran++)//rank
{
for ( ; student[i].rank == ran;i++ )//i in same rank
{
for (int j = 0; j < K; j++)
{
temp_choice = student[i].Choice[j];
if (arrySchools[temp_choice] >0)
{
request[temp_choice].push_back(student[i].number);
Need.push_back(temp_choice);
break;
}
}
}
//gengxin
while (Need.empty() == false)
{
temp_choice = Need.back();
Need.pop_back();
arrySchools[temp_choice]--;
}
}
for (int i = 0; i < num_school; i++)
{
request[i].sort();
for (int j= 0;request[i].empty() == false ; j++)
{
if (j)
cout << " ";
cout << request[i].front();
request[i].pop_front();
}
cout << endl;
}
//for (int i = 0; i < num_applicator; i++)
//{
// cout <<"G:" <<student[i].G<<" Ge"<<student[i].Ge <<" Gi:"<<student[i].Gi<<" Rank:"<<student[i].rank<< endl;
//}
cin >> K;
return 0;
}