L2-005 集合相似度 (set的应用

本文探讨了解题者在使用set数据结构解决题目时遇到的问题,展示了错误代码中set与vector结合导致超时,以及如何通过简化为仅使用set并优化查找逻辑来提高代码性能。关键在于理解set的应用和迭代效率提升。
摘要由CSDN通过智能技术生成

题目链接

解题思路:

set的应用 我傻了  我居然一开始用 set + vector 写的  然后最后一个样例超时了

 

代码如下(错得):

#include<iostream>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=1e4+10;
vector<int> a[maxn];
set<int> s;
set<int> ss;
set<int> sss;
int b[maxn];
int main()
{
	int n,m,i,j;
	int k,x,y;
	cin>>n;
	for(i=1;i<=n;i++)
	{
		cin>>m;
		b[i]=m;
		while(m--)
		{
			cin>>x;
			a[i].push_back(x);
		}
	}
	cin>>k;
	int ans=0;
	int sum=0;
	while(k--)
	{
		cin>>x>>y;
		ans=0;
		sum=0;
		s.clear();
		ss.clear();
		sss.clear();
		for(i=0;i<b[x];i++)
			s.insert(a[x][i]);
		for(i=0;i<b[y];i++)
		{
			if(s.count(a[y][i])!=0)
			    ss.insert(a[y][i]);
			else
			  sss.insert(a[y][i]);
		}
		ans=ss.size();
		sum=s.size()+sss.size();
		double num=(double)ans*100/(double)sum;
		printf("%.2lf%\n",num);
	}
	return 0;
}

代码如下(正解):

#include<iostream>
#include<set>
using namespace std;
const int maxn=1e4+10;
set<int> a[maxn];
int main()
{
	int n;
	int k,m,i,j,ans;
	int x,y;
	cin>>n;
	for(i=1;i<=n;i++)
	{
		cin>>m;
		while(m--)
		{
			cin>>x;
			a[i].insert(x);
		}
	}
	cin>>k;
	while(k--)
	{
		cin>>x>>y;
		ans=0;
		for(set<int>::iterator it=a[x].begin();it!=a[x].end();it++)
		{
			if(a[y].count(*it))
			  ans++;
		}
		printf("%.2lf%\n",(double)ans*100/(double)(a[x].size()+a[y].size()-ans));
	}
	return 0;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值