1063. Set Similarity (25)
1063. Set Similarity (25)
Given two sets of integers, the similarity of the sets is defined to be Nc/Nt*100%, where Nc is the number of distinct common numbers shared by the two sets,
and Nt is the total number of distinct numbers in the two sets. Your job is to calculate the similarity of any given pair of sets.
Input Specification:
Each input file contains one test case. Each case first gives a positive integer N (<=50) which is the total number of sets. Then N lines follow, each gives a set with a positive M (<=104) and followed by M integers in the range
[0, 109]. After the input of sets, a positive integer K (<=2000) is given, followed by K lines of queries. Each query gives a pair of set numbers (the sets are numbered from 1 to N). All the numbers in a line are separated
by a space.
Output Specification:
For each query, print in one line the similarity of the sets, in the percentage form accurate up to 1 decimal place.
Sample Input:
3
3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99
2
1 2
1 3
Sample Output:
50.0%
33.3%
解题思路:
输入数组后,根据输入的数组序号对数组进行排序,然后去重,再进行类似于merge操作的遍历,获得两个数组中不同的数的个数。
#include <iostream>
#include"stdio.h"
#include"stdlib.h"
#include"algorithm"
using namespace std; struct store{
int a[10000];
int length;
bool sort_flag;//标记数组是否已经排序,可以避免重复排序
int cnt;
};
int main()
{
int N,M,K;
struct store s[50];
scanf("%d",&N);
for(int i=0;i<N;i++){
scanf("%d",&M);
s[i].length = M;
s[i].cnt=M;
s[i].sort_flag = false;
for(int j=0;j<M;j++){
scanf("%ld",&s[i].a[j]);
}
}
scanf("%d",&K); int first,second;
for(int k=0;k<K;k++){
scanf("%d%d",&first,&second);
first--;
second--;
if(!s[first].sort_flag){
sort(s[first].a,s[first].a+s[first].length);//快排
//去重
for(int i=s[first].length-1;i>=1;i--){
if(s[first].a[i]==s[first].a[i-1]){
s[first].a[i]=-1;
s[first].cnt--;//记下数组中distinct的数的个数
}
}
s[first].sort_flag=true;//已经排序了
} if(!s[second].sort_flag){
sort(s[second].a,s[second].a+s[second].length);
for(int i=s[second].length-1;i>=1;i--){
if(s[second].a[i]==s[second].a[i-1]){
s[second].a[i]=-1;
s[second].cnt--;
}
}
s[second].sort_flag=true;
}
int distinct=0;
int i=0,j=0;
while(i<s[first].length&&j<s[second].length){
if(s[first].a[i]!=-1&&s[second].a[j]!=-1){
if(s[first].a[i]<s[second].a[j]){
distinct++;
i++;
}
else if(s[first].a[i]>s[second].a[j]){
distinct++;
j++;
}
else{
i++;
j++;
}
}else{
if(s[first].a[i]==-1&&s[second].a[j]!=-1){
i++;
}else if(s[first].a[i]!=-1&&s[second].a[j]==-1){
j++;
}
else /*if(s[first].a[i]!=-1&&s[second].a[j]!=-1)*/{//用else if会超时
i++;
j++;
}
}
}
while(i<s[first].length){
if(s[first].a[i]!=-1)
distinct++;
i++;
}
while(j<s[second].length){
if(s[second].a[j]!=-1)
distinct++;
j++;
} long common = (s[first].cnt+s[second].cnt-distinct)/2;
printf("%.1f%\n",(common*100.0/(common+distinct)));
}
return 0;
}
1063. Set Similarity (25)的更多相关文章
- PAT 甲级 1063 Set Similarity (25 分) (新学,set的使用,printf 输出%,要%%)
1063 Set Similarity (25 分) Given two sets of integers, the similarity of the sets is defined to be ...
- 【PAT】1063. Set Similarity (25) 待改进
Given two sets of integers, the similarity of the sets is defined to be Nc/Nt*100%, where Nc is the ...
- 1063 Set Similarity (25分)
Given two sets of integers, the similarity of the sets is defined to be /, where Nc is the number ...
- PAT 1063 Set Similarity (25)
题意:给你n个集合,k次询问,每次询问求两个集合的(交集)/(并集). 思路:k有2000,集合大小有10000.先将每个集合排序,对每个询问分别设两个指针指向两个集合的头.设a[i]为指针1的值,b ...
- PAT (Advanced Level) 1063. Set Similarity (25)
读入之后先排序. 询问的时候可以o(m)效率得到答案. #include<cstdio> #include<cstring> #include<cmath> #in ...
- PAT甲题题解-1063. Set Similarity (25)-set的使用
题意:两个整数集合,它们的相似度定义为:nc/nt*100%nc为两个集合都有的整数nt为两个集合一共有的整数注意这里的整数都是各不相同的,即重复的不考虑在内.给出n个整数集合,和k个询问,让你输出每 ...
- 【PAT甲级】1063 Set Similarity (25 分)
题意: 输入一个正整数N表示集合的个数(<=50),接着输入N行,每行包括一个数字x代表集合的容量(<=10000),接着输入x个非负整数.输入一个正整数Q(<=2000),接着输入 ...
- PAT 1063 Set Similarity[比较]
1063 Set Similarity (25 分) Given two sets of integers, the similarity of the sets is defined to be N ...
- PAT 1063. Set Similarity
1063. Set Similarity 题目大意 给定 n 个集合, k 个询问, 求任意两个集合的并集和合集. 思路 一道裸的考察 STL 中 set 的题, 我居然还用 hash 错过一遍, 用 ...
随机推荐
- 外键为','(逗号)拼接ID,连接查询外键表ID
select distinct pipeId=substring(a.PipeIn,b.number,charindex(',',a.PipeIn+',',b.number)-b.number) fr ...
- 4类 JavaScript 内存泄露及如何避免
原文:4 Types of Memory Leaks in JavaScript and How to Get Rid Of Them笔记:涂鸦码龙 译者注:本文并没有逐字逐句的翻译,而是把我认为重要 ...
- SecureCRT中文显示乱码
环境:SecureCRT登陆REDHAT5.3 LINUX系统 问题:vi编辑器编辑文件时文件中的内容中文显示乱码,但是直接使用linux系统terminal打开此文件时中文显示正常,确诊问题出现在客 ...
- java判断字符串是否为数字或中文或字母
个人认为最好的方法 *各种字符的unicode编码的范围: * 汉字:[0x4e00,0x9fa5](或十进制[19968,40869]) * 数字:[0x30,0x39](或十进制 ...
- PHP入门 - - 05-->编写HTML页面的常用标签
一.文字版面的编辑 1.格式标签 格式标签用于定义网页中文本的布局.缩进.位置.换行.列表等 <br> 换行 <p> ...
- 2016.8.14 HTML5重要标签以及属性学习
1.响应网格系统,这使得它很容易把元素放在行,并指定每个元素的相对宽度 . 要注意的是: 在使用网格布局系统之前,要不把布局的元素都添加到同一个<div>中,而且这个<div> ...
- PHP 批量修改图片的名字
<?php // glob() 返回指定目录下的文件名以及目录 $arr = glob("img/*.jpg"); $time = time(); $i = 100001; ...
- 1、Delphi 打开目录和txt文件模块
//1.打开目录和打开txt文件 procedure TMainForm.bbtnOpenLoClick(Sender: TObject); var sLogName: string; begin s ...
- Dockerfile完成Hadoop2.6的伪分布式搭建
在 <Docker中搭建Hadoop-2.6单机伪分布式集群>中在容器中操作来搭建伪分布式的Hadoop集群,这一节中将主要通过Dokcerfile 来完成这项工作. 1 获取一个简单的D ...
- 餐厅系统app版