1. 程式人生 > 其它 >1063 Set Similarity (25 分)

1063 Set Similarity (25 分)

Given two sets of integers, the similarity of the sets is defined to be/, whereNc​​is the number of distinct common numbers shared by the two sets, andNt​​is the total number of distinct numbers in the two sets. Your job is to calculate the similarity of any given pair of sets.

Input Specification:

Each input file contains one test case. Each case first gives a positive integerN(≤) which is the total number of sets. ThenNlines follow, each gives a set with a positiveM(≤) and followed byMintegers in the range [0]. After the input of sets, a positive integerK(≤) is given, followed byKlines of queries. Each query gives a pair of set numbers (the sets are numbered from 1 toN). All the numbers in a line are separated by a space.

Output Specification:

For each query, print in one line the similarity of the sets, in the percentage form accurate up to 1 decimal place.

Sample Input:

3
3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99
2
1 2
1 3

Sample Output:

50.0%
33.3%
思路:挺麻煩的一個題,充分利用了vector和set
#include<bits/stdc++.h>
using
namespace std; const int maxn=1010; #define eps 1e-8 #define inf 0x3fffffff int main(){ vector<set<int> > v; int n,k,m,t; cin>>n; v.resize(n); for(int i=0;i<n;i++){ cin>>m; for(int j=0;j<m;j++){ cin>>k; v[i].insert(k); } } cin>>t; int a,b; for(int i=0;i<t;i++){ cin>>a>>b; int ct=0,nt=v[a-1].size(); for(set<int>::iterator it=v[b-1].begin();it!=v[b-1].end();it++){ if(v[a-1].find(*it)!=v[a-1].end()){ ct++; } else{ nt++; } } printf("%.1f%\n",1.0*ct/nt*100); } return 0; }