相似的数集(set的应用)

青藤 210764 相似的数集

思路:第一个是两个数集的共有数字,第二个是两个数集的所有数字,两个都不能出现重复数字,然后除起来*100在添上一个%,建一个set数组,然后插入进去,接着在输入时找到x和y对应的数组数集,把x的元素全部遍历,然后y数集有就计数,第一个就是计数器的值,第二个就是两数集长度和-重复部分(即为计数器的值),然后依次输出,当然也可以把两个数集合并(因为集合可去重),然后以此类推,不过会超时

代码:
1.100分

#include<bits/stdc++.h>
using namespace std;
set<int>a[51];
int n,m,i,j,x,y,lx,ly,cnt;
int main(){
    
    
	ios::sync_with_stdio(false);
	cin>>n;
	for(i=1;i<=n;i++){
    
    
		cin>>m;
		for(j=0;j<m;j++){
    
    
			cin>>x;
			a[i].insert(x);
		}
	}
	cin>>m;
	while(m--){
    
    
		cin>>x>>y;
		lx=a[x].size();
		ly=a[y].size();
		cnt=0;
		for(set<int>::iterator it=a[x].begin();it!=a[x].end();++it)
			if(a[y].find(*it)!=a[y].end())
				cnt++;
		printf("%.2lf%%\n",cnt*100.0/(lx+ly-cnt));
	}
    return 0;
}

2.40分

#include<bits/stdc++.h>
using namespace std;
set<int>a[51],b;
int n,m,i,j,k,x,y,lx,ly,lb;
int main(){
    
    
	ios::sync_with_stdio(false);
	cin>>n;
	for(i=1;i<=n;i++){
    
    
		cin>>m;
		for(j=0;j<m;j++){
    
    
			cin>>x;
			a[i].insert(x);
		}
	}
	cin>>k;
	while(k--){
    
    
		cin>>x>>y;
		lx=a[x].size();
		ly=a[y].size();
		set<int>::iterator it=a[x].begin();
		for(;it!=a[x].end();++it)b.insert(*it);
	    for(it=a[y].begin();it!=a[y].end();++it)b.insert(*it);
		lb=b.size();
		printf("%.2lf%%\n",(lx+ly-lb)*1.0/lb*100);
		b.clear();
	}
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_52536621/article/details/113747602