PAT甲级1063 Set Similarity:[C++题解]哈希表、去重
生活随笔
收集整理的這篇文章主要介紹了
PAT甲级1063 Set Similarity:[C++题解]哈希表、去重
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 題目分析
- 題目鏈接
題目分析
來源:acwing
分析:集合相似度是兩個集合A、B都有的數字個數,除以兩者不同的數字個數,有以下公式:集合相似度 =NcNt=A∩BA+B?Nc=\frac{N_c}{N_t}=\frac{A∩B}{A+B-N_c}=Nt?Nc??=A+B?Nc?A∩B?
以樣例中的集合1和2為例解釋一下:
3 3 99 87 101 4 87 101 5 87 7 99 101 18 5 135 18 99 2 1 2 1 3樣例1:兩個集合中元素個數分別為:A = 3個,B = 3個(注意不是4個,需要去重),兩個集合相同元素2個,所以Nc=2N_c =2Nc?=2,Nt=3+3?2=4N_t=3+3 -2 =4Nt?=3+3?2=4,這樣計算出來的50%。
求兩個集合的交集:Nc //時間復雜度O(M) for(auto x: A)if(x in B)Nc ++;ac代碼
#include<bits/stdc++.h> using namespace std; const int N =55; unordered_set<int> S[N]; //有幾個集合就開幾個hash表,并且是set去重int main(){int n, k;cin >> n;for( int i = 1; i<= n; i++){int m;scanf("%d",&m);while(m--){int x;scanf("%d",&x);S[i].insert(x); //插入到集合i的hash表中}}//詢問cin >> k;while(k--){int a, b;scanf("%d%d",&a,&b);int nc = 0; //分子//遍歷集合a中的每個元素,如果在集合b中出現過,就統計下//這樣nc就是公共元素的個數,這里如果是公共元素,則.count(x)==1for( auto x: S[a]) nc += S[b].count(x);//分母int nt =S[a].size() + S[b].size() - nc;//%在C語言輸出,需要轉義 ,寫成%% printf("%.1lf%%\n", (double)nc/nt * 100);}}題目鏈接
PAT甲級1063 Set Similarity
https://www.acwing.com/problem/content/1551/
總結
以上是生活随笔為你收集整理的PAT甲级1063 Set Similarity:[C++题解]哈希表、去重的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT甲级1048 Find Coins
- 下一篇: PAT甲级1120 Friend Num