http://acm.pku.edu.cn/JudgeOnline/problem?id=1075
Код:
#include <iostream> #include <math.h> using namespace std; int equal(float fir,float sec) { return (fabs(fir-sec)<0.0000001); } int main() { int student,stu_reg[151],stu_mark[151],stu_k[151],stu_fdu[151][51]; int school,sch_reg[51],sch_cap[51]; int org[51][151];int stu_belong[151]; int i,j,k,t;int n; cin>>n; for(i=0;i<n;i++) { if(i!=0) cout<<endl; cin>>student>>school; for(j=1;j<=student;j++) { cin>>stu_reg[j]>>stu_mark[j]>>stu_k[j]; for(t=1;t<=stu_k[j];t++) cin>>stu_fdu[j][t]; } for(j=1;j<=school;j++) cin>>sch_reg[j]>>sch_cap[j]; for(j=1;j<=student;j++) stu_belong[j]=-1; for(j=1;j<=school;j++) for(t=1;t<=student;t++) org[j][t]=t; for(j=1;j<=school;j++) { float mark[151]; for(t=1;t<=student;t++) { if(stu_reg[t]==sch_reg[j]) mark[t]=(float)stu_mark[t]; else mark[t]=(float)stu_mark[t]/1.7; } for(t=1;t<=student;t++) { int pt=t; for(k=t+1;k<=student;k++) { if(mark[org[j][pt]]<mark[org[j][k]]) pt=k; else if(equal(mark[org[j][pt]],mark[org[j][k]])&&stu_reg[org[j][k]]==sch_reg[j]) pt=k; } if(pt!=t) { int temp=org[j][t];org[j][t]=org[j][pt];org[j][pt]=temp; } } } int flag[51][151]; for(j=1;j<=school;j++) for(t=1;t<=student;t++) flag[j][t]=0; int used[151]; for(j=1;j<=student;j++) used[j]=0; for(j=1;j<=school;j++) { for(t=1;t<=school;t++) { for(k=1;k<=sch_cap[t];k++) { if(k>student) break; if(flag[t][k]) continue; int temstu=org[t][k]; int q; if(stu_belong[temstu]==-1) for(q=1;q<=j;q++) { if(q>stu_k[temstu]){flag[t][k]=1;sch_cap[t]++;break; } if(stu_fdu[temstu][q]==t) { stu_belong[temstu]=t; used[temstu]=q; flag[t][k]=1; break; } } else { int tempt=used[temstu]; for(q=1;q<used[temstu];q++) { if(stu_fdu[temstu][q]==t) { sch_cap[stu_belong[temstu]]++; stu_belong[temstu]=t; used[temstu]=q; flag[t][k]=1; break; } } if(q==tempt) { flag[t][k]=1; sch_cap[t]++; continue; } } } } } for(j=1;j<=student;j++) { if(stu_belong[j]==-1) cout<<"not accepted"<<endl; else cout<<stu_belong[j]<<endl; } } return 0; }