1. 程式人生 > 實用技巧 >11.14補題報告

11.14補題報告

7-11集合相似度(25分)

給定兩個整數集合,它們的相似度定義為:/。其中Nc​​是兩個集合都有的不相等整數的個數,Nt​​是兩個集合一共有的不相等整數的個數。你的任務就是計算任意一對給定集合的相似度。

輸入格式:

輸入第一行給出一個正整數N(≤),是集合的個數。隨後N行,每行對應一個集合。每個集合首先給出一個正整數M(≤),是集合中元素的個數;然後跟M個[區間內的整數。

之後一行給出一個正整數K(≤),隨後K行,每行對應一對需要計算相似度的集合的編號(集合從1到N編號)。數字間以空格分隔。

輸出格式:

對每一對需要計算的集合,在一行中輸出它們的相似度,為保留小數點後2位的百分比數字。

輸入樣例:

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

輸出樣例:

50.00%
33.33%

題解:求兩個集合中交集和並集的比值,並集的個數等於兩個集合自身去重之後的個數 - 兩個集合相同的個數,
用一個set陣列把兩個集合存起來,再去遍歷尋找相同的元素值即可。
ac程式碼:
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<map>
#include<set>
using namespace std;
set<int> s[55];
int main()
{
    
int n,nn,m,i,k,a,b,a1,a2; cin>>n; for(i=1;i<=n;i++){ cin>>m; while(m--){ cin>>nn; s[i].insert(nn); } } cin>>k; while(k--){ cin>>a>>b; set<int>::iterator it; a1=s[a].size(); a2
=s[b].size(); int count=0; for(it=s[a].begin();it!=s[a].end();it++) { if (s[b].find(*it)!=s[b].end()){ count++; } } printf("%.2f%\n",count*100.00/(a1+a2-count)); } return 0; }
View Code