1. 程式人生 > 其它 >3202 子集和判斷51nod(2)

3202 子集和判斷51nod(2)

技術標籤:51nodmapSTLc++

3202 子集和判斷
1.0 秒 131,072.0 KB 40 分 初學者4級題
題目描述
給出 2 個集合 A,B,判斷 A 是否為 B 的子集和。由於集合 A, B 本身都可能存在重複的元素,因此如果 A 中某個元素的數量多於 B,也不認為 A 是 B 的子集。子集忽略集合元素的順序。

輸入
第1行:一個數t,表示測試集的數量。(1 <= t <= 10)
每個test第1行:2個數m,n中間用空格分隔,對應集合 A,B 的大小(2 <= m, n <= 50000)
每個test第2行:m 個數,中間用空格分隔,對應集合 B 的元素。(1 <= Bi <= 50000)

每個test第3行:n 個數,中間用空格分隔,對應集合 A 的元素。(1 <= Ai <= 50000)
輸出
共t行,每行輸出 Yes 或 No,如果A是B的子集,則輸出 Yes,否則輸出 NO
輸入樣例
2
3 3
1 1 2
1 2 1
2 3
1 1
1 2 2
輸出樣例
Yes
No
題目連結:http://class.51nod.com/Challenge/Problem.html#problemId=3202
解題思路2
1.考慮當陣列A元素個數大於B的時候,也不是子集。
2.需要比較A中的元素是否都是B中的元素,而不是比較他們各自元素的個數是否相同
完整程式碼2

#include<bits/stdc++.h>
using namespace std; map<int,int>::iterator A1; map<int,int>::iterator B1; int t,m,n,e,f,Asum,Bsum; int main() { cin >> t; for(int i = 1;i <= t;i++) { map<int,int>A;// map這個變數要放在迴圈裡, 因為變數在每個迴圈都會改變 map<int,int>B; bool flag=1; cin >>
m >> n; if(n>m) { flag = 0; } for(int j = 0;j < m;j++) { cin >> e; A[e]++;//預設情況下B[e]沒有值,B[e]++後,B[e]為1,之後再增加 } for(int j = 0;j < n;j++) { cin >> f; B[f] ++; } for (B1=B.begin(); B1!=B.end(); B1++) { if(A[B1->first]==0||A[B1->first]<B1->second) { flag = 0; } } if(flag) { cout<<"Yes"<<endl; } else { cout<<"No"<<endl; } } }

PS:如果不想些迭代器的朋友們可以翻看我的上一個Blog哦!裡面的程式碼會更簡單哦!