FOJ-集合运算

版权声明: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!')

猜你喜欢

转载自blog.csdn.net/weixin_42348709/article/details/83591028