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 }
本文来自博客园,作者:{scanner},转载请注明原文链接:{https://home.cnblogs.com/u/scannerkk/}