日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

L2-005 集合相似度-PAT团体程序设计天梯赛GPLT

發布時間:2025/3/20 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 容器,它不會保存重復元素。

設要求的兩個集合分別為 AAABBB,它們的大小分別為 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。