版权声明:wywwzjj https://blog.csdn.net/weixin_42348709/article/details/83591028
题目大意:给你三组数。当你用集合的定义将他们转化成三个集合 A、B、C 后,如果A 集合与 B 集合能通过上述三种集合运算(并集运算、交集运算和差集运算)得到集合 C。则从小到大输出集合 C 的所有元素,否则输出“What a pity!”(不含引号)。
题意理解:判断 A、B 两集合能否通过交、并、差三种运算得到 C。
实际上,这题放水了,只需判断 A & B、A | B、A - B、B - A 中有没有恰好等于 C。
这样就不好玩了,前者的话还需要求幂集,后者只需要用几个库函数?
参考代码
#include<bits/stdc++.h>
using namespace std;
vector<int> v, tmp;
bool fg = 0;
void print() {
if (tmp == v) {
for (int i = 0; i < v.size(); i++) {
printf("%d", v[i]);
if(i < v.size()-1)
printf(" ");
}
fg = 1;
}
tmp.clear();
}
int main() {
int n, m, k, t; scanf("%d%d%d", &n, &m, &k);
set<int> s1, s2, st;
while (n--) {scanf("%d", &t); s1.insert(t);}
while (m--) {scanf("%d", &t); s2.insert(t);}
while (k--) {scanf("%d", &t); st.insert(t);}
for (set<int>::iterator it = st.begin(); it != st.end(); it++) v.push_back(*it);
// A | B
set_union(s1.begin(), s1.end(), s2.begin(), s2.end(), back_inserter(tmp));
print(); if(fg) return 0;
// A & B
set_intersection(s1.begin(), s1.end(),s2.begin(), s2.end(), back_inserter(tmp));
print(); if(fg) return 0;
// A - B
set_difference(s2.begin(), s2.end(), s1.begin(),s1.end(), back_inserter(tmp));
print(); if(fg) return 0;
// B - A
set_difference(s1.begin(), s1.end(), s2.begin(),s2.end(), back_inserter(tmp));
print(); if(fg) return 0;
if(fg == 0) puts("What a pity!");
return 0;
}
再说个求幂集的办法
- 直接调用
from itertools import combinations
if __name__=='__main__':
n, m, k = [int(i) for i in input().split(' ')]
st1 = set([int(i) for i in input().split(' ')])
st2 = set([int(i) for i in input().split(' ')])
st3 = set([int(i) for i in input().split(' ')])
vst = [st1-st2, st2-st1, st1&st2]
powset = [list(c) for i in range(len(vst) + 1) for c in combinations(vst, i)]
for i in powset:
st = set()
for j in i:
st |= j
print(st)
if st == st3:
v = list(st3)
v.sort()
for i in v:
print(str(i)+' ',end='')
print('')
exit()
print('What a pity!')
- 二进制法
if __name__=='__main__':
n, m, k = [int(i) for i in input().split(' ')]
st1 = set([int(i) for i in input().split(' ')])
st2 = set([int(i) for i in input().split(' ')])
st3 = set([int(i) for i in input().split(' ')])
vst = [st1-st2, st2-st1,st1&st2]
for i in range(len(vst)):
st = set()
j = 0
while (1<<j) <= i:
if i&(1<<j):
st |= vst[1<<j]
j += 1
if st == st3:
v = list(st3)
v.sort()
for i in v:
print(str(i)+' ',end='')
print('')
exit()
print('What a pity!')