一、找工作C++编程03--动态规划二(最佳匹配)

题目:X科大的计算机系既有无所不会的大佬,又有什么都不懂的萌新。为了让大佬能尽可能帮助萌新,最终达到共同大佬的目标,系里决定让每一位大佬带一位萌新。不过,大佬在心里对所有萌新都有个偏好顺序,比如勤奋好学的肯定排在前面。同样,

 萌新对大佬也有偏好,比如过于高冷、难以交流的肯定排在后面。如果大佬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

    if(pq[i][j]==a[i] &&pq[i][j]==b[j])
{
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;
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值