萌新对大佬也有偏好,比如过于高冷、难以交流的肯定排在后面。如果大佬A没有和萌新B配对,而A认为现在带的萌新C不如B, 同时B认为现在带他的大佬不如A,A就会丢下C而去带B飞。假设大佬和萌新的数量相等,请你帮系主任找出优先满足大佬的最佳配对,使得没有大佬会丢下萌新。
#include <iostream>
#include <cstring>
using namespace std;
/*定义配对:
n:为大佬和萌新的个数
dalao[i]:为第i个大佬的名字
fresh[i]:为第i个萌新的名字。
dp[i][j]:为第i个大佬喜爱的第j个萌新的名字
fp[i][j]:为第j个萌新喜爱的第j个大佬名字
p[i][j]:大佬i和萌新j配合的程度
q[i][j]:萌新i和大佬j配合的程度
*/
int main() {
int n;
cin>>n;
if(n>1000){
return -1;
}
int i,j;
//定义字符串矩阵
string dalao[n];//大佬姓名集合
for(i=0;i<n;i++){
cin>>dalao[i];
}
string fresh[n]; //萌新姓名集合
for(i=0;i<n;i++){
cin>>fresh[i];
}
string dp[n][n];//大佬偏好
for(i=0;i<n;i++){
for(j=0;j<n;j++){
cin>>dp[i][j];
}
}
string fp[n][n]; //萌新偏好
for(i=0;i<n;i++){
for(j=0;j<n;j++){
cin>>fp[i][j];
}
}
//转换成矩阵
int p[n][n];
int q[n][n];
for(i=0;i<n;i++){
for(j=0;j<n;j++){
for(int k=0;k<n;k++){
if(dp[i][j].compare(fresh[k])==0)
{
p[i][k]=n-j;
}
if(fp[i][j].compare(dalao[k])==0){
q[i][k]=n-j;
}
}
}
}
int pq[n][n];
for(i=0;i<n;i++){
for(j=0;j<n;j++){
pq[i][j]=p[i][j]*q[j][i];
}
}
cout<<endl;
//获取每一行的最大值
int max=0;
int a[n],b[n];
for(i=0;i<n;i++){
max=0;
for(j=0;j<n;j++){
if(max<pq[i][j]){
max=pq[i][j];
a[i]=max;
max=pq[i][j];
}
}
}
//获取每一列的最大值
for(j=0;j<n;j++){
max=0;
for(i=0;i<n;i++){
if(max<pq[i][j]){
max=pq[i][j];
b[j]=max;
max=pq[i][j];
}
}
}
int result[5];
for(i=0;i<5;i++){
result[i]=-1;
}
for(i=0;i<5;i++){
for(j=0;j<5;j++)
{
//进行比较,如果这个最大值在该行和该列最大,那么将该列号赋值给result。如果不是就赋值为-1
{
result[i]=j;
break;
}
}
}
//找出result和序号不同的数值
int temp=0;
for(i=0;i<n;i++){
j=0;
while(j<n && i!=result[j]){
j++;
}
if(j>=n){
temp=i;
break;
}
}
//将-1替换成不同的数值
for(i=0;i<n;i++){if(result[i]==(-1)){
result[i]=temp;
}
}
//输出匹配的萌新
for(i=0;i<n;i++){cout<<fresh[result[i]]<<" ";
}
return 0;
}