PAT A1063 Set Similarity (25分)

1063 Set Similarity (25分)
Given two sets of integers, the similarity of the sets is defined to be N
​c
​​ /N
​t
​​ ×100%, where N
​c
​​ is the number of distinct common numbers shared by the two sets, and N
​t
​​ is the total number of distinct numbers in the two sets. Your job is to calculate the similarity of any given pair of sets.

Input Specification:
Each input file contains one test case. Each case first gives a positive integer N (≤50) which is the total number of sets. Then N lines follow, each gives a set with a positive M (≤10
​4
​​ ) and followed by M integers in the range [0,10
​9
​​ ]. After the input of sets, a positive integer K (≤2000) is given, followed by K lines of queries. Each query gives a pair of set numbers (the sets are numbered from 1 to N). All the numbers in a line are separated by a space.

Output Specification:
For each query, print in one line the similarity of the sets, in the percentage form accurate up to 1 decimal place.

Sample Input:
3
3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99
2
1 2
1 3
Sample Output:
50.0%
33.3%

#include <cstdio>
#include <set>

using namespace std;

int main(){
	int n;
	scanf("%d", &n);
	
	set<int> s[n+1];
	for(int i=1; i<=n; i++){
		int num;
		scanf("%d", &num);
		
		for(int j=0; j<num; j++){
			int ys;
			scanf("%d", &ys);
			
			s[i].insert(ys);
		}
	}
	
	int bj;
	int nt, nc;
	int num1, num2;
	scanf("%d", &bj);
	for(int i=0; i<bj; i++){
		
		scanf("%d %d", &num1, &num2);
		nt = s[num2].size();
		nc = 0;
		
		for(set<int>::iterator it=s[num1].begin(); it!=s[num1].end(); it++){
			if(s[num2].find(*it) != s[num2].end()){
				nc++;
			}else{
				nt++;
			}
		}
		

		printf("%.1f%\n", nc*100.0/nt);
		
	}
		
	return 0;
} 

这题主要是题目比较难理解,我看了好久还没懂distinct common numbers和distinct numbers的区别。
理解题目后,很快就能反应过来用set来做,这题关键就是求并集和交集。
我开始的做法是把比较的两个set集合中的元素又加到一个新开的set中,这样很方便能求出并集和交集的数量,但是有一定概率会超时,我提交了10次大概有7次这样子超时,过的几次也都是卡着边界的时间。
用了书上的解法写了一遍,用find函数来查找相同或不同的元素,这样就不用多开一个set集合,能节省很多时间。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值