1. 程式人生 > >PAT甲級 1063 Set Similarity (25 分)Set集合

PAT甲級 1063 Set Similarity (25 分)Set集合

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%

題目大意:給定兩個整數集合,它們的相似度定義為:Nc/Nt*100%。其中Nc是兩個集合都有的不相等整數的個數,Nt是兩個集合一共有的不相等整數的個數。你的任務就是計算任意一對給定集合的相似度。

nc是兩個集合的公共元素個數,nt是兩個集合的所有包含的元素個數(其中元素個數表示各個元素之間互不相同)

分析:因為給出的集合裡面含有重複的元素,而計算nc和nt不需要考慮兩個集合裡面是否分別有重複的元素,所以可以直接使用set儲存每一個集合,然後把set放進一個數組裡面儲存。當需要計算集合a和集合b的相似度nc和nt的時候,遍歷集合a中的每一個元素,尋找集合b中是否有該元素,如果有,說明是兩個人公共的集合元素,則nc++,否則nt++(nt的初值為b集合裡面本有的元素)

PS: 注意使用set的查詢find函式

#include<cstdio>
#include<set>
#include<vector>
using namespace std;

int main(){
	int n,m,k,num,nc,nt;
	scanf("%d",&n);
	vector<set<int>> s(n+1);
	for(int i=1;i<=n;i++){
		scanf("%d",&m);
		for(int j=1;j<=m;j++){
			scanf("%d",&num);
			s[i].insert(num);
		}
	}
	scanf("%d",&k);
	int a,b;
	for(int i=1;i<=k;i++){
        scanf("%d%d",&a,&b);
        int nc = 0,nt = s[b].size();
        for(auto ita = s[a].begin();ita!=s[a].end();ita++)
        {
            if(s[b].find(*ita) != s[b].end())//ͨ¹ýfind²éÕÒ 
            	nc++;
            else
            	nt++;
        }
        printf("%.1f%\n",double(nc)/nt * 100);
	}
	return 0;
}