3202 子集和判斷51nod(2)
阿新 • • 發佈:2021-01-31
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)
輸出
共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哦!裡面的程式碼會更簡單哦!