参考了 http://blog.csdn.net/u014646950/article/details/47608823 的做法
刚开始做的时候最后一个测试点总是超时。
应该直接把重复的都去除掉,用set自带的查找去完成(效率高),没找到会返回结尾来判定是否找到。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <climits>
#include <string>
#include <map>
#include <stack>
#include <queue>
#include <set>
#define MAX 100010
using namespace std;
map <int,int> num2no;
set <int> list[2018];
int n ,k;
int main(){
int no = 1;
scanf("%d",&n);
for(int i = 1;i <= n ;i++){
int m,v;
scanf("%d",&m);
for(int j = 0 ;j<m;j++){
scanf("%d",&v);
list[i].insert(v);
}
}
scanf("%d",&k);
for(int i =0 ;i < k ;i++){
int l1,l2,same = 0;
scanf("%d%d",&l1,&l2);
set <int> ::iterator it;
for(it = list[l1].begin() ;it!=list[l1].end();it++){
if(list[l2].find(*it) != list[l2].end())
same++;
}
float rate = float(same) / float(list[l1].size()+list[l2].size()-same) * 100;
printf("%.1f%%\n",rate);
}
return 0;
}