PTA集合相似度

一、题目描述

 

 二、解题思路

  首先这个题意讲的我迷糊,最后才知道这个Nc就是交集,Nt就是并集。然后我老老实实用set,map做,T了一个点。最后上网一搜,发现别人用了神奇的stl大法求交集并集。

三、代码实现

 1 #include "bits/stdc++.h"
 2 #define PII pair<int,int>
 3 #define rep(i,z,n) for(int i = z;i <= n; i++)
 4 #define per(i,n,z) for(int i = n;i >= z; i--)
 5 #define ll long long
 6 #define db double
 7 #define vi vector<int>
 8 #define debug(x) cerr << "!!!" << x << endl;
 9 using namespace std;
10 //从某个串中把某个子串替换成另一个子串
11 string& replace_all(string& src, const string& old_value, const string& new_value) {
12     // 每次重新定位起始位置,防止上轮替换后的字符串形成新的old_value
13     for (string::size_type pos(0); pos != string::npos; pos += new_value.length()) {
14         if ((pos = src.find(old_value, pos)) != string::npos) {
15             src.replace(pos, old_value.length(), new_value);
16         }
17         else break;
18     }
19     return src;
20 }
21 inline ll read()
22 {
23     ll s,r;
24     r = 1;
25     s = 0;
26     char ch = getchar();
27     while(ch < '0' || ch > '9'){
28         if(ch == '-')
29             r = -1;
30         ch = getchar();
31     }
32     while(ch >= '0' && ch <= '9'){
33         s = (s << 1) + (s << 3) + (ch ^ 48);
34         ch = getchar();
35     }
36     return s * r;
37 }
38 inline void write(ll x)
39 {
40     if(x < 0) putchar('-'),x = -x;
41     if(x > 9) write(x / 10);
42     putchar(x % 10 + '0');
43 }
44 vector <ll> vis[51];
45 ll l,r;
46 int main()
47 {
48     int t;
49     cin >> t;
50     ios::sync_with_stdio(false);
51     for(int i = 0;i < t;i++){
52         int n;
53         n = read();
54         for(int j = 1;j <= n;j++){
55             ll d = read();
56             vis[i].push_back(d);  
57         }
58         sort(vis[i].begin(),vis[i].end());
59     }
60     ll k;
61     k = read();
62     while(k--){
63         ll l,r;
64         vector <ll> target1;
65         vector <ll> target2;
66         l = read();
67         r = read();
68         //求并集
69         set_union(vis[l - 1].begin(),vis[l - 1].end(),vis[r - 1].begin(),vis[r - 1].end(),inserter(target1,target1.begin()));
70         //求交集
71         set_intersection(vis[l - 1].begin(),vis[l - 1].end(),vis[r - 1].begin(),vis[r - 1].end(),inserter(target2,target2.begin()));
72         //去重
73         //去重之前要先排序
74         target1.erase(unique(target1.begin(),target1.end()),target1.end());
75         target2.erase(unique(target2.begin(),target2.end()),target2.end());    
76          cout << fixed << setprecision(2) << target2.size() * 100.0 / target1.size() << '%' << endl;
77     }
78     return 0;
79 }
posted @ 2022-03-19 16:07  scannerkk  阅读(100)  评论(0)    收藏  举报