1063. Set Similarity (25)

时间限制
300 ms
内存限制
32000 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

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)的更多相关文章

  1. 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 ...

  2. 【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 ...

  3. 1063 Set Similarity (25分)

    Given two sets of integers, the similarity of the sets is defined to be /, where N​c​​ is the number ...

  4. PAT 1063 Set Similarity (25)

    题意:给你n个集合,k次询问,每次询问求两个集合的(交集)/(并集). 思路:k有2000,集合大小有10000.先将每个集合排序,对每个询问分别设两个指针指向两个集合的头.设a[i]为指针1的值,b ...

  5. PAT (Advanced Level) 1063. Set Similarity (25)

    读入之后先排序. 询问的时候可以o(m)效率得到答案. #include<cstdio> #include<cstring> #include<cmath> #in ...

  6. PAT甲题题解-1063. Set Similarity (25)-set的使用

    题意:两个整数集合,它们的相似度定义为:nc/nt*100%nc为两个集合都有的整数nt为两个集合一共有的整数注意这里的整数都是各不相同的,即重复的不考虑在内.给出n个整数集合,和k个询问,让你输出每 ...

  7. 【PAT甲级】1063 Set Similarity (25 分)

    题意: 输入一个正整数N表示集合的个数(<=50),接着输入N行,每行包括一个数字x代表集合的容量(<=10000),接着输入x个非负整数.输入一个正整数Q(<=2000),接着输入 ...

  8. PAT 1063 Set Similarity[比较]

    1063 Set Similarity (25 分) Given two sets of integers, the similarity of the sets is defined to be N ...

  9. PAT 1063. Set Similarity

    1063. Set Similarity 题目大意 给定 n 个集合, k 个询问, 求任意两个集合的并集和合集. 思路 一道裸的考察 STL 中 set 的题, 我居然还用 hash 错过一遍, 用 ...

随机推荐

  1. c语言运算符号的优先级

    c语言运算符号的优先级 本文来自百度搜索只为查看方便 优先级等级口诀: 圆方括号.箭头一句号, 自增自减非反负.针强地址长度, 乘除,加减,再移位, 小等大等.等等不等, 八位与,七位异,六位或,五与 ...

  2. Git的安装与使用

    1,下载git https://code.google.com/p/msysgit/downloads/list 2,安装git ,我们选择命令行形式,这样无论在window下还是在linux下 都可 ...

  3. 配置tomcat下war包可以自压缩

    <Host name="localhost" appBase="/home/hark/web" unpackWARs="true" a ...

  4. Liferay 6.2 改造系列之六:修改系统初始化信息

    将初始化过程修改为:中文语言 在/portal-master/portal-impl/src/system.properties文件中,有如下配置: # # Set the default local ...

  5. POJ 1200 字符串HASH

    题目链接:http://poj.org/problem?id=1200 题意:给定一个字符串,字符串只有NC个不同的字符,问这个字符串所有长度为N的子串有多少个不相同. 思路:字符串HASH,因为只有 ...

  6. vim使用02

    编辑 剪切光标所在的字符: <x>; 剪切并插入: <s> 撤销操作:撤销至上一个命令之间的修改: <u> 恢复上一次撤销操作: <C r> 剪切光标所 ...

  7. appium定位元素java篇【转】

    1.关于没有name,没有ID的元素的定位---通用篇解题思路:因为没有name,id:其实剩下的选择已不多,要么xpath,要么className.xpath木有好印象(稳定性不高,加之1.0x后需 ...

  8. TStringList 常用操作

    //TStringList 常用方法与属性: var   List: TStringList;   i: Integer; begin   List := TStringList.Create;   ...

  9. 为什么模板函数的声明和实现都放在.h文件中

    当你不使用这个模板函数或模板类,编译器并不实例化它,当你使用时,编译器需要实例化它,因为编译器是一次只能处理一个编译单元,也就是一次处理一个cpp文件,所以实例化时需要看到该模板的完整定义.所以都放在 ...

  10. HDU4807 Lunch Time(费用流变种)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4807 Description The campus of Nanjing Universit ...