大致题意就是给出N个整数的集合(编号1到N),然后给出K个不同的查询,每个查询给出集合的两个编号i 和 j,计算这两个集合的相似度。
N?c表示两个集合的交集的不同元素的总个数,N?t表示两个集合合并以后的不同整数的总个数。
计算相似度的公式为 N?c??/N?t??×100%。
STL:unordered_set,以及其函数insert,size,count。
注意点:通过开辟新的集合,来统计两个集合合并以后的整数个数,会导致最后一个测试点超时。
如果已知两个集合的总的整数个数,可以通过查找的方式来统计它们相同的整数的个数,间接求出两个集合合并以后的整数个数。
#include"iostream" #include"unordered_set" using namespace std; unordered_set<int> sets[60]; int main() { int n,m,t; scanf("%d",&n); for(int i = 1; i <=n; ++i) { scanf("%d",&m); for(int j = 0; j < m; ++j) { scanf("%d",&t); sets[i].insert(t); } } int k,i,j;//k个查询,集合i 和j scanf("%d",&k); while(k--) { scanf("%d%d",&i,&j); int sum = sets[i].size() + sets[j].size(); int sameNum = 0;//统计两个集合 交集元素个数 for(auto it = sets[j].begin(); it != sets[j].end(); ++it) { if(sets[i].count(*it) == 1) { //如果能找到 sameNum++; } } int NT = sum - sameNum; int NC = sameNum; printf("%.1f%%\n",100.0*NC/NT); } return 0; }
原文:https://www.cnblogs.com/keep23456/p/12304867.html