L2 005 集合相似度

2021-08-08 05:06:24 字數 1369 閱讀 3206

時間限制

400 ms

記憶體限制

65536 kb

**長度限制

8000 b

判題程式

standard

作者 陳越

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

輸入格式:

輸入第一行給出乙個正整數n(<=50),是集合的個數。隨後n行,每行對應乙個集合。每個集合首先給出乙個正整數m(<=104),是集合中元素的個數;然後跟m個[0, 109]區間內的整數。

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

輸出格式:

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

輸入樣例:

3

3 99 87 101

4 87 101 5 87

7 99 101 18 5 135 18 99

21 2

1 3

輸出樣例:
50.00%

33.33%

思路分析:

利用set處理集合,自動刪掉重複出現過的元素。

注意:本題最後一組測試資料量較大,為了減少執行時間,一方面可以加乙個二維陣列儲存求過的集合相似度,避免重複運算,另一方面在就總的不同整數個數時,不要遍歷兩個set並插入乙個新的set中,可以直接新建乙個set讓它等於seq[v1],然後只需遍歷另乙個set並插入,可以減少一半的運算量。(不要直接往seq[v1]中插,因為後邊還要再用到,破壞好會影響後邊的計算)。

題解:

#include #include using namespace std;

const int max = 51;

int n, m, k;

setseq[max];

double g[max][max] = ;

int main()

} scanf("%d", &k);

while(k--)

nt = ans.size();

nc = seq[v1].size()+seq[v2].size()-ans.size();

g[v1][v2] = g[v2][v1] = (double)nc/(double)nt*100;

} printf("%.2f%%\n", g[v1][v2]);

} return 0;

}

L2 005 集合相似度

給定兩個整數集合,它們的相似度定義為 nc nt 100 其中nc是兩個集合都有的不相等整數的個數,nt是兩個集合一共有的不相等整數的個數。你的任務就是計算任意一對給定集合的相似度。輸入格式 輸入第一行給出乙個正整數n 50 是集合的個數。隨後n行,每行對應乙個集合。每個集合首先給出乙個正整數m 1...

L2 005 集合相似度

給定兩個整數集合,它們的相似度定義為 nc nt 100 其中nc是兩個集合都有的不相等整數的個數,nt是兩個集合一共有的不相等整數的個數。你的任務就是計算任意一對給定集合的相似度。輸入第一行給出乙個正整數n 50 是集合的個數。隨後n行,每行對應乙個集合。每個集合首先給出乙個正整數m 104 是集...

L2 005 集合相似度

時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 給定兩個整數集合,它們的相似度定義為 nc nt 100 其中nc是兩個集合都有的不相等整數的個數,nt是兩個集合一共有的不相等整數的個數。你的任務就是計算任意一對給定集合的相似度。...