1. 程式人生 > >L2-005 集合相似度

L2-005 集合相似度

整數 mem 分享圖片 技術 輸出格式 fine 小數 們的 while

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

輸入格式:

輸入第一行給出一個正整數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<int>ans 來判斷兩個集合的補集 最後一個點超時了

其實只遍歷一次即可 見代碼:
技術分享圖片
#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);i--)
#define
RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m) #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define LL long long #define pb push_back #define fi first #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) /////////////////////////////////
/ #define inf 0x3f3f3f3f #define N 50+5 int main() { set<int>s[N]; int n; int num[N]; RI(n); rep(i,1,n) { int q;RI(q); while(q--) { LL x;scanf("%d",&x); s[i].insert(x); } } int q; RI(q); while(q--) { int a,b; RII(a,b); int cnta=s[a].size(); int cntb=s[b].size(); set<int> :: iterator it; int cnt=0; for(it=s[a].begin();it!=s[a].end();it++) if(s[b].find(*it)!=s[b].end()) cnt++; double ans1=(double)(cnt)/(cnta+cntb-cnt); ans1*=100; printf("%.2lf%%\n",ans1); } }
View Code






L2-005 集合相似度