团体程序设计天梯赛-练习集 L2-005 集合相似度 STL set集合的交和并

来源:互联网 发布:项目与大数据的关联性 编辑:程序博客网 时间:2024/06/04 08:52

L2-005. 集合相似度

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越

给定两个整数集合,它们的相似度定义为:Nc/Nt*100%。其中Nc是两个集合都有的不相等整数的个数,Nt是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。

输入格式:

输入第一行给出一个正整数N(<=50),是集合的个数。随后N行,每行对应一个集合。每个集合首先给出一个正整数M(<=104),是集合中元素的个数;然后跟M个[0, 109]区间内的整数。

之后一行给出一个正整数K(<=2000),随后K行,每行对应一对需要计算相似度的集合的编号(集合从1到N编号)。数字间以空格分隔。

输出格式:

对每一对需要计算的集合,在一行中输出它们的相似度,为保留小数点后2位的百分比数字。

输入样例:
33 99 87 1014 87 101 5 877 99 101 18 5 135 18 9921 21 3
输出样例:
50.00%33.33%


错误代码,最后一个测试点超时,前几个测试点一直错,后来发现比如map<int> a

在判断if(a[i]) {......}时,如果i不在map里面,那么map会创建一个<i,0>键值对,然后这个<i,0>键值对会一直保留下去,不管以后用不用的到它,因此在

if(a[i]){......}之后要遍历map的时候要格外小心,要判断下<i,0>后者是否为零


#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#include <set>#include <map>using namespace std;const int maxn = 50;map<int, int> m[maxn + 10];int main(){  int N, M, K, tn;  scanf("%d", &N);  for (int t = 1; t <= N; t++) {    scanf("%d", &M);    for (int i = 0; i < M; i++) {      scanf("%d", &tn);      m[t][tn]++;    }  }  scanf("%d", &K);  int di, fen;  for (int i = 0; i < K; i++) {    int x, y;    scanf("%d%d", &x, &y);    map<int, int> tm;    for (map<int, int>::iterator j = m[x].begin(); j != m[x].end(); j++) {      if (j->second)  //debug        tm[j->first]++;    }    for (map<int, int>::iterator j = m[y].begin(); j != m[y].end(); j++) {      if (j->second)        tm[j->first]++;    }    di = tm.size();    fen = 0;    for (map<int, int>::iterator j = m[x].begin(); j != m[x].end(); j++) {      if (j->second) {        if (m[y][j->first] != 0) fen++; //debug      }    }    printf("%.2f%%\n", 100.0 * fen / di);  }  return 0;}



使用algorithm中的set_intersection 函数和iterator中的inserter函数



#include <cstdio>#include <iostream>#include <algorithm>#include <iterator>#include <set>using namespace std;const int maxn = 50;int main(){int N, M, K;scanf("%d", &N);set<int> s[maxn + 10];for (int t = 1; t <= N; t++) {scanf("%d", &M);for (int m = 0; m < M; m++) {int x;scanf("%d", &x);s[t].insert(x);}}scanf("%d", &K);for (int k = 1; k <= K; k++) {int x, y, Nc, Nt;scanf("%d%d", &x, &y);set<int> res;set_intersection(s[x].begin(), s[x].end(), s[y].begin(), s[y].end(), inserter(res, res.begin()));Nt = s[x].size() + s[y].size() - res.size();Nc = res.size();printf("%.2f%%\n", 100.0 * Nc / Nt);}return 0;}




0 0
原创粉丝点击