日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

ssl1125-集合【哈希表二分查找+快排】

發(fā)布時(shí)間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ssl1125-集合【哈希表二分查找+快排】 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

今天學(xué)哈希表,然后就第一節(jié)晚修趕快寫(xiě)完作業(yè)就上了做題了,然后就做完了這道題get√。


正題


題目

給出兩個(gè)集合:
A是B的一個(gè)真子集,輸出“A is a proper subset of B”
B是A的一個(gè)真子集,輸出“B is a proper subset of A”
A和B是同一個(gè)集合,輸出“A equals B”
A和B的交集為空,輸出“A and B are disjoint”
上述情況都不是,輸出“I’m confused!”
然后集合大小小于10^5,集合中的數(shù)大小小于10^9


輸入輸出(建議無(wú)視)

Input

輸入有兩行,分別表示兩個(gè)集合,每行的第一個(gè)整數(shù)為這個(gè)集合的元素個(gè)數(shù)(至少一個(gè)),然后緊跟著這個(gè)集合的元素(均為不同的正整數(shù))

Output

只有一行,就是A、B的關(guān)系。

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!


解題思路

二分查找+快排

這就是用快排排好第一個(gè)集合然后用二分查找找另一個(gè)集合里的數(shù)。

(正題)哈希表

用哈希表儲(chǔ)存第一個(gè)集合,然后快速判斷集合中有沒(méi)有另一個(gè)集合中的數(shù)


代碼

二分查找+快排

#include<cstdio> #include<algorithm>//c++算法庫(kù)自帶快排 using namespace std; int n1,n2,a1[100001],a2[100001],l,r,ans,s,mid; char c; int main() {scanf("%d",&n1);for (int i=1;i<=n1;i++){scanf("%d",&a1[i]);}scanf("%d",&n2);for (int i=1;i<=n2;i++){scanf("%d",&a2[i]);}sort(a1+1,a1+1+n1);//快排for (int i=1;i<=n2;i++){ans=a2[i];//查找對(duì)象l=1;r=n1;//范圍while (l<=r){mid=(l+r)/2;//取中間值if (a1[mid]==ans) break;//找到就退出if (a1[mid]<ans) l=mid+1;else r=mid-1;//縮小范圍}if (a1[mid]==ans) s++;//統(tǒng)計(jì)相同數(shù)}//以下輸出不解釋if (s==n1 && s==n2) printf("A equals B");else if (s==n1) printf("A is a proper subset of B");else if (s==n2) printf("B is a proper subset of A");else if (s==0) printf("A and B are disjoint");else printf("I'm confused!"); }

哈希表

#include<cstdio> #include<algorithm> using namespace std; const int maxn=149993;//開(kāi)個(gè)大一些的素?cái)?shù)減少?zèng)_突 int n1,n2,hash[maxn],x,s; int hashmath(int x) {return x%maxn; }//哈希函數(shù) int locate(int x)//尋找位置 {int i=0,w=hashmath(x);while (i<maxn && hash[(w+i)%maxn]!=0 && hash[(w+i)%maxn]!=x)//找到空位,相同的或沒(méi)有空位(數(shù)組開(kāi)大已經(jīng)避免了)i++;//下一個(gè)return (w+i)%maxn;//返回值 } void ins(int x)//插入函數(shù) {int w=locate(x);//尋找位置hash[w]=x;//插入 } bool find(int x)//查找 {int w=locate(x);//尋找位置if (hash[w]==x) return true;//是否存在else return false; } int main() {scanf("%d",&n1);for (int i=1;i<=n1;i++){scanf("%d",&x);ins(x);//插入}scanf("%d",&n2);for (int i=1;i<=n2;i++){scanf("%d",&x);if (find(x)) s++;//統(tǒng)計(jì)次數(shù)}//以下輸出if (s==n1 && s==n2) printf("A equals B");else if (s==n1) printf("A is a proper subset of B");else if (s==n2) printf("B is a proper subset of A");else if (s==0) printf("A and B are disjoint");else printf("I'm confused!"); }

總結(jié)

以上是生活随笔為你收集整理的ssl1125-集合【哈希表二分查找+快排】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。