給定兩個整數集合,它們的相似度定義為: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
2 1 2
1 3
輸出樣例:
50.00%
33.33%
解題思路:這題目並不難但是我一開始沒理解題意,其實nc是兩個集合共有的元素,nt是兩個集合不同元素之和,同集合會自動把重複的元素除去也不會影響解題,我下面貼出兩種解法。(解法一有個測試點會執行超時)
解法一:分別順序遍歷兩集合時間複雜度較大會超時
#include
#include
#include
#include
using
namespace
std;
vector
> vec;
int main(void)
vec.push_back(s);
}cin>>m;
for(int i=0;iint a,b; set
al;//這裡我把兩個計算的集合全都重新加入乙個新的集合之中
cin>>a>>b;
for(auto iter=vec[a-1].begin();iter!=vec[a-1].end();iter++)
al.insert(*iter);
for(auto iter=vec[b-1].begin();iter!=vec[b-1].end();iter++)
al.insert(*iter);
nt=al.size();//兩個元素集合全部不同元素個數就是新集合個數
//共有元素個數是之前兩集合元素個數之和減去新集合元素個數應為在insert時會除去相同元素
nc=vec[a-1].size()+vec[b-1].size()-al.size();
printf("%.2f%%\n",double(nc)*100/double(nt));
}return
0;}
解法二:這種方法遍歷了某乙個集合,然後用函式find,find函式時間複雜度是會比順序查詢要低的,所以不會超時
#include
#include
#include
#include
using
namespace
std;
vector
> vec;
int main(void)
vec.push_back(s);
}cin>>m;
for(int i=0;iint a,b;
cin>>a>>b;
nt=vec[b-1].size();nc=0;
//這裡遍歷某一集合,如果在另一集合中找到則nc加一,否則nt加一,nc初值0
//nt初值為另一集合的元素個數
for(auto iter1=vec[a-1].begin();iter1!=vec[a-1].end();iter1++)
printf("%.2f%%\n",double(nc)*100/double(nt));
}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是兩個集合一共有的不相等整數的個數。你的任務就是計算任意一對給定集合的相似度。...