L2-005 集合相似度-PAT团体程序设计天梯赛GPLT
題目來源:團體程序設計天梯賽-練習集
題目地址:L2-005 集合相似度
題目大意
給定 nnn 個集合,然后有 kkk 次詢問,每次詢問都要求出 Nc/Nt×100%N_c / N_t \times100\%Nc?/Nt?×100%
NcN_cNc? 表示兩個集合中都有的數的個數(重復不計),相當于求交集去重。
NtN_tNt? 表示兩個集合一共有多少個數(重復不計),相當于求并集去重。
題目分析
根據題意,我們在存儲集合就時候就可以將重復元素去掉,可以用上C++ STL提供的 setsetset 容器,它不會保存重復元素。
設要求的兩個集合分別為 AAA 和 BBB,它們的大小分別為 SizeASize_ASizeA? 和 SizeBSize_BSizeB?
我們先遍歷集合 AAA ,每訪問一個元素就判斷它是否在集合 BBB中出現,如果出現,則計數器 cntcntcnt 加一,最后得出的 cntcntcnt 就是 NcN_cNc?。
因為有 cntcntcnt 個數在集合 AAA 出現一遍,又在集合 BBB 中出現了一遍,所以求 NtN_tNt? 的時候我們需要將它減去,最后我們得到求 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來進行集合的存儲*/ 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() 返回的是集合中不同元素的個數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; }如果本文對你有所幫助,記得要點贊哦~
總結
以上是生活随笔為你收集整理的L2-005 集合相似度-PAT团体程序设计天梯赛GPLT的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: L2-004 这是二叉搜索树吗?-团体程
- 下一篇: L2-006 树的遍历-团体程序设计天梯