题面
输入样例
3
3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99
2
1 2
1 3
输出样例
50.00%
33.33%
解法一(最大随机数据tle)
- 最容易想到,直接合并两个set
- set合并的时间复杂度有点大:set1.insert(set2.begin(),seet2.end());对于最大规模的随机数据会T
#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
set<int> st[n];
for(int i=0;i<n;i++) {
int m;
scanf("%d",&m);
for(int j=0;j<m;j++) {
int tmp;
scanf("%d",&tmp);
st[i].insert(tmp);
}
}
int k;
cin >> k;
for(int i=0;i<k;i++) {
int x,y;
cin >> x >> y;
x--;y--;
int lx = st[x].size();
int ly = st[y].size();
set<int> tx = st[x];
set<int> ty = st[y];
//求两个set的交集res
tx.insert(ty.begin(),ty.end());
double per = double(lx + ly - tx.size())/tx.size()*100;
printf("%.2f%%",per);
if(i!=k-1){
cout << endl;
}
}
return 0;
}
解法二(set + find)
- 容易想到
- 没有解法三效率高
#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
set<int> st[n];
for(int i=0;i<n;i++) {
int m;
scanf("%d",&m);
for(int j=0;j<m;j++) {
int tmp;
scanf("%d",&tmp);
st[i].insert(tmp);
}
}
int k;
cin >> k;
for(int i=0;i<k;i++) {
int x,y;
cin >> x >> y;
x--;y--;
set<int> :: iterator it = st[y].begin();
int nc=0;//两个集合的相同个数
for(;it!=st[y].end();it++) {
if(st[x].find((*it))!=st[x].end()){
nc ++;
}
}
int nt = st[x].size()+st[y].size()-nc;
double per = nc*100/double(nt);
printf("%.2f%%",per);
if(i!=k-1){
cout << endl;
}
}
return 0;
}
解法三(*set内置交集函数)
- 效率高
- 不容易想到(也可能是我见识太少太菜了…)
#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
set<int> st[n];
for(int i=0;i<n;i++) {
int m;
scanf("%d",&m);
for(int j=0;j<m;j++) {
int tmp;
scanf("%d",&tmp);
st[i].insert(tmp);
}
}
int k;
cin >> k;
for(int i=0;i<k;i++) {
int x,y;
cin >> x >> y;
x--;y--;
int lx = st[x].size();
int ly = st[y].size();
set<int> tx = st[x];
set<int> ty = st[y];
set<int> res;
//求两个set的交集res
set_intersection(st[x].begin(),st[x].end(),st[y].begin(),st[y].end(),inserter(res,res.begin()));
double per = res.size()*100/double(lx + ly - res.size());
printf("%.2f%%",per);
if(i!=k-1){
cout << endl;
}
}
return 0;
}
- set_intersection函数并不常见,包含在algorithm头文件中。临时使用可以参考<stl_algo.h>头文件。
按住ctrl建,点击algorithm头文件。进源码后,按住ctrl键点击stl_algo头文件。
STL中的set小结