您的位置:首页 > 产品设计 > UI/UE

L2-005. 集合相似度 unique的应用 去重 vector

2016-05-16 14:25 357 查看


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位的百分比数字。
输入样例:
3
3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99
2
1 2
1 3

输出样例:
50.00%
33.33%

#include<bits/stdc++.h>
using namespace std;
/*    ///map超时,二分超时
struct node
{
int x,y;
friend bool operator <(node x1,node y1)
{
if(x1.x==y1.x)
return x1.y<y1.y;
return x1.x<y1.x;
}
} p;
*/
int main()
{
int n;
while(~scanf("%d",&n))
{
vector <int> Q[100],QQ;
//
for(int i=0; i<n; i++)
{
int m;
scanf("%d",&m);
for(int j=0; j<m; j++)
{
int t;
scanf("%d",&t);
Q[i].push_back(t);
//cout<<Q[i][j];
}
sort(Q[i].begin(),Q[i].end());

vector<int>::iterator it=unique(Q[i].begin(),Q[i].end());
Q[i].erase(it,Q[i].end());  //必须以it作为首地址;
}

int m;
scanf("%d",&m);
vector<int>::iterator it;

for(int i=0; i<m; i++)
{
QQ.clear();
int a,b;
scanf("%d%d",&a,&b);
a--;
b--;
double sum=Q[a].size()+Q[b].size(),num=0;

for(it =Q[a].begin(); it!=Q[a].end(); it++)
QQ.push_back(*it);

for(it=Q[b].begin();it!=Q[b].end();it++)
QQ.push_back(*it);

sort(QQ.begin(),QQ.end());       ///先排序  (必须先排序)

it=unique(QQ.begin(),QQ.end());   ///定义unique 最后指针     ///返回的是最后的指针,指针之前(begin()-it)的是不重复元素,指针之后(it-end())的是重复的元素,

QQ.erase(it,QQ.end());  ///删除重复的元素
num=QQ.size();

sum=(sum-num)/num*100;
printf("%.2lf%%\n",sum);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: