1063.Set Similarity

【題意】
        給出幾個集合(有重複元素),按照給出的規則計算幾個集合間的相似度

【思路】

        用set存下每一個集合,比較時記兩個集合元素個數分別爲a和b(無重複),通過在一個集合中找另一個集合中的元素得出並集的元素個數c,則相似度爲(a+b-c)/c*100%


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

int main(int argc, char const *argv[])
{
	vector<set<int>> sets;
	int n,k;

	scanf("%d", &n);
	sets.resize(n);
	for(int i=0; i<n; i++){
		int m;
		scanf("%d", &m);
		for(int j=0; j<m; j++){
			int num;
			scanf("%d", &num);
			sets[i].insert(num);
		}
	}

	scanf("%d", &k);
	for(int i=0; i<k; i++){
		int s[2],cnt[2],totalCnt;
		float rate = 100.0;
		set<int> tmp;

		scanf("%d%d", &s[0], &s[1]);
		for(int j=0; j<2; j++){
			s[j] -= 1;
			cnt[j] = sets[s[j]].size();
		}

		totalCnt = cnt[0];
		for(set<int>::iterator it=sets[s[1]].begin(); it!=sets[s[1]].end(); it++){
			if(sets[s[0]].find(*it)==sets[s[0]].end()){
				totalCnt++;
			}
		}

		rate *= (cnt[0]+cnt[1])*1.0/totalCnt-1;
		printf("%.1f%%\n", rate);
	}

	system("pause");
	return 0;
}


發佈了99 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章