zoukankan      html  css  js  c++  java
  • 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
    ");
                else
                    printf("%d
    ",man[i]);
            if(T) printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    Java数据结构与算法(24)
    urllib2使用总结
    Python常见文件操作的函数示例
    Java数据结构与算法(23)
    python代码风格检查工具──pylint
    Python抓取框架:Scrapy的架构
    Java数据结构与算法(22)
    【codeforces 431D】Random Task
    【codeforces 449C】Jzzhu and Apples
    【codeforces 20B】Equation
  • 原文地址:https://www.cnblogs.com/bxd123/p/10392229.html
Copyright © 2011-2022 走看看