zoukankan      html  css  js  c++  java
  • 湘潭大学校赛G

    Girls and Boys

    Accepted : 50   Submit : 213
    Time Limit : 1000 MS   Memory Limit : 65536 KB

    N名单身女生和N名单身男生,每个人心中都有一个按喜欢程度对所有异性的排名。每天,所有单身男生都会向自己最喜欢的单身女生表白,而收到表白的女生则会接受她最喜欢的向她表白的男生。于是他们将脱离单身并组成情侣,且永不分离。

    假设你有读心术,可以知道每个人心中的排名,那么你能够预测最后哪些人将会成为情侣么?

    Input

    有多组测试数据。每组测试数据的第一行是一个整数1 ≤ N ≤ 100。接下来N行,每行是一个1N的排列,代表各个男生对女生的排名。再接下来N行,每行也是一个1N的排列,代表各个女生对男生的排名。

    Output

    对每组数据,输出用空格隔开的N个数,其中第i个数代表男生i的女朋友的编号。

    Sample Input

    2
    1 2
    1 2
    1 2
    1 2
    2
    1 2
    2 1
    1 2
    2 1

    Sample Output

    1 2
    1 2
    这题大家都说简单,但是我觉得一点也不简单,我模拟了1个半小时啊。各种改啊,各种错,本来思路就不是很清晰,再加上代码能力不过关
    总写错,所以导致一次又一次的悲剧啊。呜呜~~
    本题的思路是这样的,算了。我还是把我的思路在代码里注释出来吧,这样读着应该比较清晰也能读懂:
    #include"stdio.h"
    #include"string.h"
    
    int vis1[105],vis2[105];
    int boy[105][105],girl[105][105];
    int sex[105],w[105];
    
    int main( )
    {
        int n,i,j,k,count;
        while(~scanf("%d",&n))
        {
            count=0;
            for(i=1;i<=n;i++)
                for(j=1;j<=n;j++)
                    scanf("%d",&boy[i][j]);
            for(i=1;i<=n;i++)
                for(j=1;j<=n;j++)
                    scanf("%d",&girl[i][j]);
            memset(vis1,0,sizeof(vis1));//vis1[i]表示第i个男生是否配对成功;
            memset(vis2,0,sizeof(vis2));//vis2[i]表示第i个女生是否配对成功;
            memset(sex,0,sizeof(sex));  //里面记录着第i个男生的女朋友是第几个女生;
            while(count<n)              //count表示此时的情侣对数,如果已达到n对则自动跳出;
            {
                memset(w,0,sizeof(w));
                for(j=1;j<=n;j++)       //j表示女生的编号;
                {
                    if(vis2[j]==1)
                        continue;
                    for(k=1;k<=n;k++)   //k表示男生的编号;
                    {
                        if(vis1[k]==1||w[k]!=0)
                            continue;
                        for(i=1;vis2[boy[k][i]]!=0;i++);//注意这里,找出第k个男生本次所要表白的女生;
                        if(boy[k][i]==j)//如果该女生敲好是此的第j个女生,那么表示该男生参与对j女生的表白;
                            w[k]=j;        //w[k]表示第k个男生所要表白的对象是j;
                    }
                    for(k=1;k<=n;k++)    //查找第j个女生在这些表白者中最喜欢的一个,只要有表白着就表示配对成功
                        if(w[girl[j][k]]==j)
                        {
                            vis1[girl[j][k]]=vis2[j]=1;
                            sex[girl[j][k]]=j;
                            count++;
                            break;
                        }
                }
            }
            for(i=1;i<=n;i++)
            {
                if(i==1)
                    printf("%d",sex[i]);
                else
                    printf(" %d",sex[i]);
            }
            printf("\n");
        }
        return 0;
    }
            
    
        
  • 相关阅读:
    Android文字跑马灯控件(文本自动滚动控件)
    Android中的“再按一次返回键退出程序”实现
    Android中 在显示ImageView时图片上面和下面都出现一段空白区间的解决办法
    问题解决The connection to adb is down, and a severe error has occured.
    android关于uses-permission权限列表
    菜鸟学习Andriod-弹窗
    Andriod使用webview控件往APP里内嵌网页
    Mysql初始化root密码和允许远程访问
    转:Vmware Exsi使用简要说明
    转:怎样在VMware ESXi上 克隆虚拟机
  • 原文地址:https://www.cnblogs.com/chaosheng/p/2512187.html
Copyright © 2011-2022 走看看