Dados dos conjuntos de números enteros, su similitud se define como: N c / N t × 100%. Donde N c es el número de enteros desiguales compartidos por ambos conjuntos, y N t es el número de enteros desiguales compartidos por los dos conjuntos. Su tarea es calcular la similitud de cualquier par de conjuntos dados.
Formato de entrada:
Ingrese la primera línea para dar un número entero positivo N (≤50), que es el número de conjuntos. Las siguientes N filas, cada fila corresponde a una colección. A cada conjunto se le asigna primero un entero positivo M (≤10 4), que es el número de elementos del conjunto, seguido de M enteros en el intervalo [0,10 9].
La siguiente línea da un entero positivo K (≤2000), seguido de K líneas, cada línea corresponde al número de un par de conjuntos a calcular (los conjuntos están numerados de 1 a N). Los números están separados por espacios.
Formato de salida:
Para cada par de conjuntos que deban calcularse, envíe su similitud en una línea, que es un número porcentual con 2 lugares decimales.
Muestra de entrada:
3
3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99
2
1 2
1 3
Salida de muestra:
50.00%
33.33%
Primero comprenda el significado de la pregunta
[El conjunto ha deduplicado automáticamente todos los números]
Nc es el número de elementos iguales en los dos conjuntos
Nt es el número de todos los elementos en los dos conjuntos menos el número de Nc
-------------------------------------------------- -------------------------
[Uso del conjunto]
s [i] .insert (x); // Insertar x en el conjunto s [i]
for ( auto it = s [a] .begin (); it! = s [a] .end (); it ++) // Llamar a los elementos del conjunto [a] a través de un iterador
{
if (s [b] .count (* it)) // * ¿El elemento representado por él existe en el conjunto s [b]
{
igual ++;
}
}
código ac:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<set>
#include<queue>
#include<stack>
using namespace std;
const int maxv = 100100;
set<int>s[55];
int main()
{
int N;
cin>>N;
for(int i=1;i<=N;i++)
{
int M;
cin>>M;
for(int j=0;j<M;j++)
{
int x;
cin>>x;
s[i].insert(x);
}
}
int K;
cin>>K;
for(int i=0;i<K;i++)
{
int a,b;
cin>>a>>b;
int equal=0;
for(auto it=s[a].begin();it!=s[a].end();it++)
{
if(s[b].count(*it))
{
equal++;
}
}
printf("%.2f",equal*1.0/(s[a].size()+s[b].size()-equal)*100);
cout<<"%\n";
}
return 0;
}