L2-005 集合相似度-PAT团体程序设计天梯赛GPLT
題目來(lái)源:團(tuán)體程序設(shè)計(jì)天梯賽-練習(xí)集
題目地址:L2-005 集合相似度
題目大意
給定 nnn 個(gè)集合,然后有 kkk 次詢問(wèn),每次詢問(wèn)都要求出 Nc/Nt×100%N_c / N_t \times100\%Nc?/Nt?×100%
NcN_cNc? 表示兩個(gè)集合中都有的數(shù)的個(gè)數(shù)(重復(fù)不計(jì)),相當(dāng)于求交集去重。
NtN_tNt? 表示兩個(gè)集合一共有多少個(gè)數(shù)(重復(fù)不計(jì)),相當(dāng)于求并集去重。
題目分析
根據(jù)題意,我們?cè)?strong>存儲(chǔ)集合就時(shí)候就可以將重復(fù)元素去掉,可以用上C++ STL提供的 setsetset 容器,它不會(huì)保存重復(fù)元素。
設(shè)要求的兩個(gè)集合分別為 AAA 和 BBB,它們的大小分別為 SizeASize_ASizeA? 和 SizeBSize_BSizeB?
我們先遍歷集合 AAA ,每訪問(wèn)一個(gè)元素就判斷它是否在集合 BBB中出現(xiàn),如果出現(xiàn),則計(jì)數(shù)器 cntcntcnt 加一,最后得出的 cntcntcnt 就是 NcN_cNc?。
因?yàn)橛?cntcntcnt 個(gè)數(shù)在集合 AAA 出現(xiàn)一遍,又在集合 BBB 中出現(xiàn)了一遍,所以求 NtN_tNt? 的時(shí)候我們需要將它減去,最后我們得到求 NtN_tNt? 的式子如下:
Nt=SizeA+SizeB?cntN_t=Size_A+Size_B-cntNt?=SizeA?+SizeB??cnt
代碼如下
#include <bits/stdc++.h>using namespace std; int n, m, t, k, a, b; const int maxn = 1e4 + 10; /*** 利用stl中set來(lái)進(jìn)行集合的存儲(chǔ)*/ set<int> vis[maxn]; int main() {scanf("%d", &n);for (int i = 1; i <= n; i++) {scanf("%d", &m);while (m--) {scanf("%d", &t);vis[i].insert(t);}}scanf("%d", &k);while (k--) {scanf("%d %d", &a, &b);// set.size() 返回的是集合中不同元素的個(gè)數(shù)int cnt1 = vis[a].size(), cnt2 = vis[b].size(), cnt3 = 0;for (auto e : vis[a]) {if (vis[b].count(e))cnt3++;}printf("%.2f%\n", (double)cnt3 / (cnt1 + cnt2 - cnt3) * 100);}return 0; }如果本文對(duì)你有所幫助,記得要點(diǎn)贊哦~
總結(jié)
以上是生活随笔為你收集整理的L2-005 集合相似度-PAT团体程序设计天梯赛GPLT的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: L2-004 这是二叉搜索树吗?-团体程
- 下一篇: L2-006 树的遍历-团体程序设计天梯