1063 Set Similarity

虽说按照ref是过了:

http://linest.github.io/blog/2013/09/02/4/

但是,这种方法谁特么能记住!

#include <algorithm>//set_intersection()
#include <iterator>//back_inserter( )这么逗比的
set_intersection(sets[a].begin(),sets[a].end(), sets[b].begin(), sets[b].end(),back_inserter(res));//操操操!!!!


原理还是对A排序并去重,对B排序并去重,然后类似于merge操作找出二者的common数

#include <stdio.h>
#include <set>
#include <vector>
#include <algorithm>//set_intersection()
#include <iterator>//back_inserter( )这么逗比的
using namespace std;


int n;
set<int> sets[50+5];

int main(){
	freopen("in.txt","r",stdin);

	scanf("%d",&n);

	for(int i = 1; i <= n; i++){//注意set是从1开始排号的,fuck!
		int m;
		scanf("%d",&m);
		for(int j = 0; j < m; j++){
			int tmp;
			scanf("%d",&tmp);
			sets[i].insert(tmp);//重复的元素自动被覆盖
		}
	}

	int k;
	scanf("%d",&k);
	for(int i = 0; i < k; i++){
		int a, b;
		scanf("%d %d",&a, &b);
		vector<int> res;

		set_intersection(sets[a].begin(),sets[a].end(), sets[b].begin(), sets[b].end(),back_inserter(res));//操操操!!!!

		int commonDist = res.size();
		int totalDist = sets[a].size()+sets[b].size();
		printf("%.1f%%\n", ((float)commonDist/(totalDist-commonDist))*100.0);
	}


	return 0;
}


你可能感兴趣的:(1063 Set Similarity)