Girls and Boys |
||
Accepted : 50 | Submit : 213 | |
Time Limit : 1000 MS | Memory Limit : 65536 KB |
有N名单身女生和N名单身男生,每个人心中都有一个按喜欢程度对所有异性的排名。每天,所有单身男生都会向自己最喜欢的单身女生表白,而收到表白的女生则会接受她最喜欢的向她表白的男生。于是他们将脱离单身并组成情侣,且永不分离。 假设你有读心术,可以知道每个人心中的排名,那么你能够预测最后哪些人将会成为情侣么? Input有多组测试数据。每组测试数据的第一行是一个整数1 ≤ N ≤ 100。接下来N行,每行是一个1到N的排列,代表各个男生对女生的排名。再接下来N行,每行也是一个1到N的排列,代表各个女生对男生的排名。 Output对每组数据,输出用空格隔开的N个数,其中第i个数代表男生i的女朋友的编号。 Sample Input2
1 2
1 2
1 2
1 2
2
1 2
2 1
1 2
2 1
Sample Output1 2
1 2 #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; } |