zoukankan      html  css  js  c++  java
  • 集合(normal)

    Description

    给定两个集合A、B,集合内的任一元素x满足1 ≤ x ≤ 109,并且每个集合的元素个数不大于105。我们希望求出A、B之间的关系。
    任 务 :给定两个集合的描述,判断它们满足下列关系的哪一种:
    A是B的一个真子集,输出“A is a proper subset of B”
    B是A的一个真子集,输出“B is a proper subset of A”
    A和B是同一个集合,输出“A equals B”
    A和B的交集为空,输出“A and B are disjoint”
    上述情况都不是,输出“I’m confused!”

    Input

    输入有两行,分别表示两个集合,每行的第一个整数为这个集合的元素个数(至少一个),然后紧跟着这个集合的元素(均为不同的正整数)

    Output

    只有一行,就是A、B的关系。

    Sample Input

    样例1
    2 55 27
    2 55 27
    样例2
    3 9 24 1995
    2 9 24
    样例3
    3 1 2 3
    4 1 2 3 4
    样例4
    3 1 2 3
    3 4 5 6
    样例5
    2 1 2
    2 2 3

    Sample Output

    样例1
    A equals B
    样例2
    B is a proper subset of A
    样例3
    A is a proper subset of B
    样例4
    A and B are disjoint
    样例5
    I’m confused!

    .
    .
    .
    .
    .
    分析
    我们先不管A 与 B 的具体关系如何,注意到这个问题的本质就是对于给定的集合A ,确定B 中的元素是否在 A 中。所以,我们使用哈希表来处理。至于哈希函数,只要按照除余法就行了

    当然,也可以用快排+二分做

    .
    .
    .
    .
    .
    哈希

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    
    int mo=155559;
    int h[155559];
    
    int hash(int x)
    {
    	int wz=x%mo;
    	int i=0;
    	while (i<mo&&h[(wz+i)%mo]!=-1&&h[(wz+i)%mo]!=x) i++;
    	return (wz+i)%mo;
    }
    
    
    int main()
    {
    	int na,nb;
    	scanf("%d",&na);
    	memset(h,-1,sizeof(h));
    	for (int i=1;i<=na;i++)
    	{
    		int a;
    		scanf("%d",&a);
    		h[hash(a)]=a;
    	}
    	int ans=0;
    	scanf("%d",&nb);
    	for (int i=1;i<=nb;i++)
    	{
    		int b;
    		scanf("%d",&b);
    		if (h[hash(b)]==b) ans++;
    	}
    	if (na==nb&&na==ans) printf("A equals B"); else
    	if (ans==0) printf("A and B are disjoint"); else
    	if (na>nb&&nb==ans) printf("B is a proper subset of A"); else
    	if (nb>na&&na==ans) printf("A is a proper subset of B"); else
    	printf("I'm confused!");
    	return 0;
    }
    

    .
    .
    .
    .
    .

    快排+二分

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int ans=0,a[100001],na,nb;
    
    void ef(int x)
    {
    	int l=1,r=na,mid;
    	while (l<=r)
    	{
    		mid=(l+r)/2;
    		if (a[mid]==x) 
    		{
    			ans++;
    			return;
    		}
    		if (a[mid]>x) r=mid-1; else l=mid+1;
    	}
    }
    
    
    int main()
    {
    	scanf("%d",&na);
    	for (int i=1;i<=na;i++)
    		scanf("%d",&a[i]);
    	sort(a+1,a+na+1);
    	
    	scanf("%d",&nb);
    	for (int i=1;i<=nb;i++)
    	{
    		int b;
    		scanf("%d",&b);
    		ef(b);
    	}
    	if (na==nb&&na==ans) printf("A equals B"); else
    	if (ans==0) printf("A and B are disjoint"); else
    	if (na>nb&&nb==ans) printf("B is a proper subset of A"); else
    	if (nb>na&&na==ans) printf("A is a proper subset of B"); else
    	printf("I'm confused!");
    	return 0;
    }```
    
    
  • 相关阅读:
    浏览器渲染流程
    MVC模式
    传统的DOM是如何进行渲染的
    报文的概念及理解
    单页面开发与多页面开发的优缺点
    第4次作业
    售票系统
    第三次作业
    第二次作业
    第一次作业
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/10292794.html
Copyright © 2011-2022 走看看