题目:

解题:
主要思路分析:
翻译器数加1的情形:(两个人处于双重for循环内,以遍历到任意两对人)
1 两个人,如果任何一个一种语言都不会,
2.两个人如果会的语言没有交集,且找不到第三人分别与两人均有交集,机器数加1。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int help(vector<vector<int>> matrix,int i,int j);
bool isJoint(vector<vector<int>> matrix,int i,int j);
int main ()
{
int n,m,k;
cin>>n>>m>>k;
int u,v;
vector<vector<int>> matrix(n);
for(int i=0;i<k;i++){
cin>>u>>v;
matrix[u-1].push_back(v);
}
int cnt=0;
bool tag;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==j) continue; //遇到与自己配对的直接跳过
tag=false;
if(matrix[i].size()==0||matrix[j].size()==0) cnt++;
else {
for(auto it:matrix[i])
if(find(matrix[j].begin(),matrix[j].end(),it)!=matrix[j].end()) { tag=true;break;}
if(!tag) cnt+=help(matrix, i, j);
}
}
}
cout<<cnt/n<<endl; //去重
return 0;
}
int help(vector<vector<int>> matrix,int i,int j){ //
for(int k=0;k<matrix.size();k++){
if(k==i||k==j) continue;
if(isJoint(matrix,i,k)&&isJoint(matrix,j,k)) return 0; //若寻求到了第三人帮助,不需
// 额外添加翻译机
}
return 1; ////若没寻求到第三人帮助,需额外添加翻译机: cnt++
}
bool isJoint(vector<vector<int>> matrix,int i,int j){ //判断两人是否具有语言交集
if(matrix[i].size()==0||matrix[j].size()==0) return false;
vector<int> im(matrix[i]);
vector<int> jm(matrix[j]);
sort(im.begin(),im.end()); // 排序为了更容易比较两个vector(降低时间复杂度)
sort(jm.begin(),jm.end());
int idx=0,jdx=0;
while(idx<matrix[i].size()&&jdx<matrix[j].size()){ //时间复杂度O(n+m)
if(im[idx]>jm[jdx]) jdx++;
else if(im[idx]<jm[jdx]) idx++;
else return true; //两人有共同语言,结束返回
}
return false; //两人没有语言交集
}
本文深入探讨了在特定社交场景下,如何通过算法确定所需翻译器数量的问题。具体分析了当参与者不会任何共同语言时,如何寻找第三方协助,以及算法实现的详细步骤,包括双重for循环、语言交集判断等关键部分。
8441

被折叠的 条评论
为什么被折叠?



