2019年2月8日
22:24
1.一个数组存学习名额
2.一个结构体数组存学生信息
3.排序
4.从高到低选择,名额减一,二维数组记录信息,如果学校名额变为0,记录最后一个学生信息(结构体数组),要是排名一样学生选择,任然计入
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
using namespace std;
typedef struct P
{
double Ge, Gi, Gf;
int ch[10];
int c, y;
int pm;
}P;
P x, z[105];
vector<P> p;
vector<int> m, cho[105];
bool cmp(P a, P b)
{
if(a.Gf != b.Gf)
return a.Gf > b.Gf;
else
return a.Ge > b.Ge;
}
int cap(P a, P b)
{
if(a.Gf == b.Gf && a.Ge == b.Ge)
return 0;
return -1;
}
int main()
{
int N, M, K, a;
while(cin >> N >> M >> K)
{
for(int i = 0; i < M; i++)
{
scanf("%d" ,&a);
m.push_back(a);
}
for(int i = 0; i < N; i++)
{
x.y = i;
scanf("%lf%lf", &x.Ge, &x.Gi);
x.Gf = (x.Ge + x.Gi) / 2;
for(int j = 0; j < K; j++)
scanf("%d", &x.ch[j]);
x.c = -1;
p.push_back(x);
}
sort(p.begin(), p.end(), cmp);
for(int i = 0; i < N; i++)
{
//cout << p[i].Gf << endl;
for(int j = 0; j < K; j++)
{
int cc = p[i].ch[j];
if(m[cc] > 0)
{
m[cc]--;
cho[cc].push_back(p[i].y);
p[i].c = cc;
z[cc] = p[i];
break;
}
else if(m[cc] == 0)
{
if(cap(z[cc], p[i]) == 0)
{
cho[cc].push_back(p[i].y);
p[i].c = cc;
z[cc] = p[i];
break;
}
}
}
}
for(int i = 0; i < M; i++)
{
sort(cho[i].begin(), cho[i].end());
for(int j = 0; j < cho[i].size(); j++)
{
if(j != 0)
printf(" ");
printf("%d", cho[i][j]);
//printf(" ");
}
cout << endl;
}
}
return 0;
}