L2-005 集合相似度(STL+暴力)
Posted MangataTS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了L2-005 集合相似度(STL+暴力)相关的知识,希望对你有一定的参考价值。
题目连接
https://pintia.cn/problem-sets/994805046380707840/problems/994805070149828608
思路
这道题其实难点在于理解题意,其中的
N
c
N_c
Nc 其实就是两个集合的交集的元素个数,
N
t
N_t
Nt 就是两个集合合并后的元素个数(去重),那么我们利用set
或者 map
就能很好的实现这个操作,我们定义 N
个 set
然后我们查找 l
和r
的重复度的时候直接选取一个集合作为操作集合查找一下两个集合中元素的重复个数就得到了
N
c
N_c
Nc ,然后再用两个集合的元素的个数减去
N
c
N_c
Nc 就得到了
N
t
N_t
Nt
代码
set
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
#define endl "\\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3f
const int N = 55;
int n,m;
set<int> mp[N];
double ans[N][N];
double compare(int l,int r)
double nc,nt;
nc = 0;
nt = double(mp[l].size() + mp[r].size());
for(auto it : mp[l])
if(mp[r].find(it) != mp[r].end())
nc += 1.0;
nt -= nc;
return (nc/nt) * 100.0;
int main()
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
int k;
for(int i = 1;i <= n; ++i)
cin>>m;
for(int j = 1;j <= m; ++j)
cin>>k;
mp[i].insert(k);
cin>>m;
while(m--)
int l,r;
cin>>l>>r;
cout<<fixed<<setprecision(2)<<compare(l,r)<<"%"<<endl;;
return 0;
map
但是不知道为何使用map
会wa,后面再填坑吧
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
#define endl "\\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3f
const int N = 55;
int n,m;
map<int,bool> mp[N];
double ans[N][N];
double compare(int l,int r)
double nc,nt;
nc = 0;
nt = double(mp[l].size() + mp[r].size());
for(auto it : mp[l])
if(mp[r][it.first] == true)
nc += 1.0;
nt -= nc;
return (nc/nt) * 100.0;
int main()
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
int k;
for(int i = 1;i <= n; ++i)
cin>>m;
mp[i].clear();
for(int j = 1;j <= m; ++j)
cin>>k;
mp[i][k] = true;
cin>>m;
while(m--)
int l,r;
cin>>l>>r;
cout<<fixed<<setprecision(2)<<compare(l,r)<<"%"<<endl;;
return 0;
以上是关于L2-005 集合相似度(STL+暴力)的主要内容,如果未能解决你的问题,请参考以下文章