基于官方答案
解题思路
先将每个学生-老师组合的兼容性评分求出,然后利用C++ next_permutation()函数进行全排列,寻找全排列中最大兼容性评分和最高的进行返回
(中间注释部分请忽略)
class Solution {
public:
int maxCompatibilitySum(vector<vector<int>>& students, vector<vector<int>>& mentors) {
//学生/老师数量
int m=students.size();
//问卷题目数
int n=students[0].size();
//存放每个学生-老师的兼容性评分
vector<vector<int>> s(m,vector<int>(m));
//存放返回值
int Max=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<m;j++)
{
int t=0;
int temp=0;
while(t<n)
{
//当答案相同时,分数+1
if(students[i][t]==mentors[j][t])
temp++;
t++;
}
//cout<<temp<<'\t';//测试语句
//存入数组
s[i][j]=temp;
}
}
// for(int i=0;i<m;i++)
// {
// for(int j=m;j<2*m;j++)
// {
// if(i%m != j%m)
// {
// //cout<<i<<j<<'\t';
// int flag=s[i]+s[j]+s[2*m+3-i-j%m];
// //cout<<flag<<'\t';
// num.push_back(flag);
// }
// }
// }
//可能可以用双重循环代替?
vector<int> p(m);
iota(p.begin(), p.end(), 0);
do
{
int flag=0;
for(int i=0;i<m;i++)
flag+=s[i][p[i]];//每种排列的兼容性评分和
//cout<<flag<<'\t';
Max=max(Max,flag); //求出最大值
}while(next_permutation(p.begin(),p.end()));//若还有不同排列,继续循环
return Max;
}
};
作者:kutu1bw-i
链接:https://leetcode.cn/problems/maximum-compatibility-score-sum/solution/ji-yu-guan-fang-da-an-by-kutu1bw-i-cykn/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。