L2 005 集合相似度

2021-07-28 18:22:51 字數 2401 閱讀 1272

時間限制

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%

用stl中的set來解思路很簡單,提問集合 s1和s2的相似度,本來的想法是將s1中的元素放入set1中,將s2中的元素放入set2中,這樣呼叫size函式就可以求出s1中不同
元素的個數,以及s2中不同元素的個數,然後再將s1和s2放到乙個set3裡面,是兩個集合中不同元素的個數。
因此:nc = set1.size()+set2.size()-set3.size();
nt = set3.size();
想法很簡單,先給乙個超時**。
#include#include#include#include#include#include#define inf 1000

#define max(a,b) a>b? a:b

using namespace std;

setset[100002];

int main()

}scanf("%d",&k); //接下來會詢問k個集合的相似度

while(k--)

for(it = set[s2].begin(); it != set[s2].end(); it++)

int nc = (set[s1].size()+set[s2].size())-setn.size();

int nt = setn.size();

double ans = (nc*1.0)/nt*100;

printf("%.2lf%%\n",ans);

}} return 0;

}

//總結超時原因:1.求某兩個集合的時候才將其放入集合,然而乙個集合很有可能和多個集合求相似度,上面的**就會多次執行將同乙個集合放入set中,這樣會浪費很多
時間,不如直接就將那n個集合放入對應的set中。而且中間為了求兩個集合中不同元素的個數,又將他們放入了第三個集合,等於說重複了。也耗時間,提交最後一組測試
不過,顯示超時。做的時候特無語,怎麼做都是最後一組資料超時。
改進方法,直接將題目中給出的n個集合,放入相應的set中,一步到位。然後當求兩個集合中相同元素的個數時,直接取第乙個集合的每個元素看在第二個集合存不存在。
所以我想到用find函式。結果用find函式超時,又用count方法,count(key_value)是用來統計key_value在集合中的出現的次數,由於set可去重,則返回的值只有1和0.
1就代表存在。用count稀里糊塗的過了,但是感覺統計乙個值在集合中出現的次數,不是還要去進行查詢嗎?真的搞不通find就超時,count就過,是個神馬道理。
下面是正確**:
#include#include#include#include#include#include#define inf 1000

#define max(a,b) a>b? a:b

using namespace std;

setset[100002];

int main()

} scanf("%d",&k); //接下來會詢問k個集合的相似度

while(k--)

int nt = set[s1].size()+set[s2].size()-count;

double ans = (count*1.0)/nt*100;

printf("%.2lf%%\n",ans);

} }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是兩個集合一共有的不相等整數的個數。你的任務就是計算任意一對給定集合的相似度。...