PAT|1063 Set Similarity(set、集合)

题目大意

给定两组整数,这组整数的相似度定义为N C / N t ×100%,其中N C 两组是共有的不同公共数的数量,N t 是两组中不同数字的总数。您的工作是计算任何给定组对的相似度。

  • 举个栗子

3 99 87 101
4 87 101 5 87
Nc:87、101
Nt:5、87、99、101
相似度:2/4*100%=50.0%

题解分析

  • 经过读题发现单个集合内的重复元素在计算上没有任何作用、因此可以直接使用set来进行存储数据。
  • 在对两个set进行比较求解的时候,可以考虑使用set的遍历
  • 在我的代码中比较了需要操作的两个数字的大小,是为了在一定程度上降低不必要的查找
  • 最后注意int double类型的转换问题。

AC代码

#include<bits/stdc++.h>
using namespace std;
int numSet, numQue;
vector< set<int> > vecSet;

void computeSimilarity(int x, int y) {//计算两个集合之间的相似度
	int size1 = vecSet[x].size();
	int size2 = vecSet[y].size();
	int sum = 0;//两个集合相同的数量	
	if (size1 < size2) {//遍历size1
		set<int>::iterator iter,iter2;
		for (iter = vecSet[x].begin(); iter != vecSet[x].end(); iter++) {
			iter2 = vecSet[y].find(*iter);
			if (iter2 != vecSet[y].end())
				sum++;
		}
	}
	else {
		set<int>::iterator iter, iter2;
		for (iter = vecSet[y].begin(); iter != vecSet[y].end(); iter++) {
			iter2 = vecSet[x].find(*iter);
			if (iter2 != vecSet[x].end())
				sum++;
		}
	}
	double res;
	res = (sum * 100.0) / ((size1 + size2 - sum) * 1.0);
	printf("%.1lf", res); cout << '%' << endl;
}

int main() {
	cin >> numSet;
	for (int i = 0; i < numSet; i++) {//数据读入
		int tem;
		cin >> tem;
		set<int> mySet;
		for (int j = 0; j < tem; j++) {
			int nu;
			cin >> nu;
			mySet.insert(nu);
		}
		vecSet.push_back(mySet);
		mySet.clear();		
	}
	cin >> numQue;
	for (int i = 0; i < numQue; i++) {
		int x, y;
		cin >> x >> y;
		computeSimilarity(x-1, y-1);
	}
	return 0;
}

提交结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值