http://ac.jobdu.com/problem.php?pid=1005
参考了 http://blog.csdn.net/abcjennifer/article/details/7292011
#include <stdio.h>
#include <vector>
#include <cstring>
#include <algorithm>
typedef struct applicant{
int ge,gi,choice[6],id;
friend bool operator < (struct applicant a, struct applicant b){
int aSum = a.ge + a.gi;
int bSum = b.ge + b.gi;
return aSum != bSum? aSum > bSum:a.ge > b.ge;
}
} App;
int main(){
//freopen("in/1005.in","r",stdin);
int n,m,k;
App apps[40001];
int quota[101];
int bar[101][2];
std::vector<int> enrollList[101];
while(scanf("%d%d%d",&n,&m,&k)!=EOF){
for (int i = 0; i < 101; ++i) enrollList[i].clear();
memset(bar,0,sizeof(bar) );
for (int i = 0; i < m; ++i)
scanf("%d","a[i]);
for (int i = 0; i < n; ++i) {
scanf("%d%d",&apps[i].ge,&apps[i].gi);
apps[i].id = i;
for (int j = 0; j < k; j++) {
scanf("%d", &apps[i].choice[j]);
}
}
std::sort(apps,apps+n);
for (int i = 0; i < n; ++i) {
for (int j = 0; j< k; ++j) {
int univ = apps[i].choice[j];
if( (bar[univ][0] == apps[i].ge&&bar[univ][1] == apps[i].gi)
||quota[univ] > 0){
quota[univ]--;
enrollList[univ].push_back(apps[i].id);
bar[univ][0] = apps[i].ge;
bar[univ][1] = apps[i].gi;
break;
}
}
}
for (int i = 0; i < m; ++i) {
std::sort(enrollList[i].begin(),enrollList[i].end());
int l = (int) enrollList[i].size();
bool first = true;
for (int j = 0; j < l ; ++j) {
if(first){
printf("%d",enrollList[i][(unsigned)j]);
first = false;
}else{
printf(" %d",enrollList[i][(unsigned)j]);
}
}
printf("\n");
}
}
return 0;
}