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;
}