1063 Set Similarity (25 分)
原代码,在\(\color{deepskyblue}{PAT}\)上能取得\(25pts\)的满分好成绩,但在其他地方都超时了,gg。
set<int> S[55];
double res[55][55];
int n,m;
void init()
{
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
set<int> tot;
set<int> common;
for(auto t:S[i]) tot.insert(t);
for(auto t:S[j])
{
if(S[i].count(t)) common.insert(t);
tot.insert(t);
}
res[i][j]=1.0*common.size()/tot.size();
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int k;
scanf("%d",&k);
for(int j=0;j<k;j++)
{
int x;
scanf("%d",&x);
S[i].insert(x);
}
}
init();
cin>>m;
while(m--)
{
int a,b;
cin>>a>>b;
printf("%.1f%%\n",res[a][b]*100);
}
//system("pause");
return 0;
}
思考一下,对代码简化一下就可以在其他地方过辣。
set<int> S[55];
double res[55][55];
int n,m;
void init()
{
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
int nc=0;
for(auto t:S[i]) nc+=S[j].count(t);
int nt=S[i].size()+S[j].size()-nc;
res[i][j]=1.0*nc/nt;
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int k;
scanf("%d",&k);
for(int j=0;j<k;j++)
{
int x;
scanf("%d",&x);
S[i].insert(x);
}
}
init();
cin>>m;
while(m--)
{
int a,b;
scanf("%d%d",&a,&b);
printf("%.1f%%\n",res[a][b]*100);
}
//system("pause");
return 0;
}