天梯赛 L2-005 集合相似度

版权声明:欢迎大佬批评指正!O(∩_∩)O https://blog.csdn.net/wyh1618/article/details/88829130

L2-005 集合相似度 (25 分)

给定两个整数集合,它们的相似度定义为:N​c​​/N​t​​×100%。其中N​c​​是两个集合都有的不相等整数的个数,N​t​​是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。

输入格式:

输入第一行给出一个正整数N(≤50),是集合的个数。随后N行,每行对应一个集合。每个集合首先给出一个正整数M(≤10​4​​),是集合中元素的个数;然后跟M个[0,10​9​​]区间内的整数。

之后一行给出一个正整数K(≤2000),随后K行,每行对应一对需要计算相似度的集合的编号(集合从1到N编号)。数字间以空格分隔。

输出格式:

对每一对需要计算的集合,在一行中输出它们的相似度,为保留小数点后2位的百分比数字。

输入样例:

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%

作者: 陈越

单位: 浙江大学

时间限制: 400 ms

内存限制: 64 MB

代码长度限制: 16 KB

超时两个点代码:

#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
struct s{
	int a[10010];
	int len;
}s[10010];
int main()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		int m;
		cin>>m;
		for(int j=0;j<m;j++){
			cin>>s[i].a[j];
		}
		s[i].len = m;
	}
	int t;
	cin>>t;
	for(int i=0;i<t;i++){
		int a;
		int b;
		double num1 = 0;
		double num2 = 0;
		cin>>a>>b;
		map<int,int>m1;
		map<int,int>m2;
		for(int k=0;k<s[a-1].len;k++){
			if(!m1[s[a-1].a[k]]){
				m1[s[a-1].a[k]] = 1;
				num1++;
			}	
			for(int l=0;l<s[b-1].len;l++){
				if(!m1[s[b-1].a[l]]){
					m1[s[b-1].a[l]] = 1;
					num1++;
				}
				if(s[a-1].a[k]==s[b-1].a[l]&&!m2[s[a-1].a[k]]){
					m2[s[a-1].a[k]] = 1;
					num2++;
				}	
			}
		}
		printf("%.2lf%%\n",num2 / num1 * 100);
	}
	return 0;
}

超时一个点代码:

#include<iostream>
#include<cstdio>
#include<map>
#include<set>
using namespace std;
int main()
{
	set<int>st[10010];
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		int m,d;
		cin>>m;
		for(int j=0;j<m;j++){
			scanf("%d",&d);
			st[i].insert(d);
		}
	}
	int t;
	cin>>t;
	for(int i=0;i<t;i++){
		int a;
		int b;
		double num1 = 0;
		double num2 = 0;
		set<int> ss;
		cin>>a>>b;
		set<int>::iterator it1;
		set<int>::iterator it2;
		for(it1=st[a-1].begin();it1!=st[a-1].end();it1++){
			ss.insert(*it1);
			for(it2=st[b-1].begin();it2!=st[b-1].end();it2++){
				ss.insert(*it2);
				if(*it1==*it2){
					num1++;
				}
			}
		}
		num2 = ss.size();
		printf("%.2lf%%\n",num1 / num2 * 100);
	}
	return 0;
}

AC代码:

#include<iostream>
#include<cstdio>
#include<map>
#include<set>
using namespace std;
int main()
{
	set<int>st[10010];
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		int m,d;
		cin>>m;
		for(int j=0;j<m;j++){
			scanf("%d",&d);
			st[i].insert(d);
		}
	}
	int t;
	cin>>t;
	for(int i=0;i<t;i++){
		int a;
		int b;
		double num1 = 0;
		double num2 = 0;
		set<int> ss;
		cin>>a>>b;
		set<int>::iterator it1;
		set<int>::iterator it2;
		for(it1=st[a-1].begin();it1!=st[a-1].end();it1++){
			if(st[b-1].find(*it1)!=st[b-1].end()){
				num1++;
			}
		}
		num2 = st[a-1].size() + st[b-1].size() - num1;
		printf("%.2lf%%\n",num1 / num2 * 100);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/wyh1618/article/details/88829130