L2-005 集合相似度
阿新 • • 發佈:2019-03-20
整數 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--) #defineView CodeRI(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); } }
L2-005 集合相似度