University Entrace Examination zoj1023

学校招收学生   优先级按照:  分数  是否本地  志愿先后

相当于 女的开后宫 

对gs进行略微修改

结束的条件为每个男的表白完所有女的

第二部分比较时    找出女的后宫里的吸引力最弱的男的比较  然后是否取代

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 200
#define eps 1e-6
using namespace std;
struct node
{
    int id,region,score,k;
}stu[N];
struct node1
{
    int region,num;
}sch[N];
struct node2
{
    int cnt;
    int manname[N];
}woman[N];
int r,n,m;
int map1[N][N],map2[N][N],man[N],times[N],vis[N];
int cmp(node a,node b)
{
    if(a.region==r)
    {
        if(b.region==r)
            return a.score>b.score;
        if(b.region!=r)
        {
            if(abs(a.score-0.7*b.score)<eps)
                return 0;
            else
                return a.score>0.7*b.score;
        }
    }
    else if(b.region==r)
    {
        if(a.region==r)
            return a.score>b.score;
        if(a.region!=r)
        {
            if(abs(b.score-0.7*a.score)<eps)
                return 1;
            else
                return b.score<0.7*a.score;
        }
    }
    else
        return a.score>b.score;
}
int cmp1(node a,node b)
{
    return a.id<b.id;
}
void makerank()
{
    int i,j;
    for(i=1;i<=m;i++)
    {
        r=sch[i].region;
        sort(stu+1,stu+n+1,cmp);
        for(j=1;j<=n;j++)
            map2[i][stu[j].id]=j;
    }
    sort(stu+1,stu+n+1,cmp1);
}
void Gale_Shapley()
{
    int flag=1,i,j,worstrank,worstrankj;
    memset(man,0,sizeof(man));
    for(i=1;i<=n;i++)
        times[i]=1;
    for(i=1;i<=n;i++)
        vis[i]=0;
    for(i=1;i<=m;i++)
        woman[i].cnt=0;
    while(flag)
    {
        flag=0;
        for(i=1;i<=n;i++)
        {
            while(!man[i]&&!vis[i])
            {
                flag=1;
                if(times[i]>stu[i].k)
                {
                    vis[i]=1;
                    break;
                }
                int name=map1[i][times[i]];
                if(woman[name].cnt<sch[name].num)
                {
                    woman[name].manname[++woman[name].cnt]=i;
                    man[i]=name;
                    times[i]++;
                }
                else if(woman[name].cnt==sch[name].num)
                {
                    worstrank=0;
                    for(j=1;j<=woman[name].cnt;j++)
                    {
                        if(map2[name][woman[name].manname[j]]>worstrank)
                        {
                            worstrank=map2[name][woman[name].manname[j]];
                            worstrankj=j;
                        }
                    }
                    if(map2[name][i]<worstrank)
                    {
                        man[woman[name].manname[worstrankj]]=0;
                        woman[name].manname[worstrankj]=i;
                        man[i]=name;
                        times[i]++;
                    }
                    else
                        times[i]++;
                }
            }
        }
    }
}
int main()
{ 
    int T,j,i;
    scanf("%d",&T);
    while(T--)
    {
        memset(map1,0,sizeof(map1));
        memset(map2,0,sizeof(map2));
        scanf("%d%d",&n,&m);
        for(i=1;i<=n;i++)
        {
            stu[i].id=i;
            scanf("%d%d%d",&stu[i].region,&stu[i].score,&stu[i].k);
            for(j=1;j<=stu[i].k;j++)
            {
                scanf("%d",&map1[i][j]);
            }
        }
        for(i=1;i<=m;i++)
        {
            scanf("%d%d",&sch[i].region,&sch[i].num);
        }
        makerank();
        Gale_Shapley();
        for(i=1;i<=n;i++)
            if(vis[i])
                printf("not accepted\n");
            else
                printf("%d\n",man[i]);
        if(T) printf("\n");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/bxd123/p/10392229.html