做法1:AC
题意可以转化为我们要找到一个最大的,使得都能被构造出来,那么答案就是。很明显我们为了维护这个集合,需要先把数字排个序,因为集合是从小往大扩充的。考虑我们已经可以用的数表示了的数,此时我们新加入一个数能加入集合需要满足如下特征:
原因是如果,那么将缺失。
那么做法就很明显了,我们只需要先把数从小到大排序,维护这个集合,直到新加入的数,答案就是
总的时间复杂度,空间复杂度

class Solution {
public:
    /**
     * 
     * @param n int整型 n
     * @param m int整型 m
     * @param a int整型一维数组 a
     * @param aLen int a数组长度
     * @param b int整型一维数组 b
     * @param bLen int b数组长度
     * @return string字符串
     */
    long long solve(int n,int *a) {
        sort(a,a+n);
        long long sum = 0;
        for(int i=0;i<n;i++) {
            if(a[i]>sum+1) break;
            sum += a[i];
        }
        return sum+1;
    }
    string Throwdice(int n, int m, int* a, int aLen, int* b, int bLen) {
        // write code here
        if(solve(n,a)>solve(n,b)) return "Happy";
        else return "Sad";
    }
};

做法2:(TLE)
和上述一样先转化为我们要找到一个最大的,使得都能被构造出来,那么答案就是。为了找到这个我们通过dfs枚举每一个数取或不取。这样的数会有个,我们将其排序,然后找到X就行。时间复杂度,空间复杂度

class Solution {
public:
    /**
     * 
     * @param n int整型 n
     * @param m int整型 m
     * @param a int整型一维数组 a
     * @param aLen int a数组长度
     * @param b int整型一维数组 b
     * @param bLen int b数组长度
     * @return string字符串
     */
    typedef long long ll;
    ll sum, a[100005],b[100005],ch[5000005],tt;
    void dfs(int x,int limit,ll sum,int *a) {
        if(x==limit) {
            if(sum!=0) ch[tt++]=sum;
            return ;
        }
        dfs(x+1,limit,sum+a[x],a);
        dfs(x+1,limit,sum,a);
    }
    ll solve(int *a,int n) {
        tt=0;
        dfs(0,n,0,a);
        sort(ch,ch+tt);
        if(ch[0]!=1) return 1;
        else  {
            int pos=1;
            while(1) {
                if(ch[pos]-ch[pos-1]!=1&&ch[pos]-ch[pos-1]!=0) return ch[pos-1]+1;
                else pos++;
            }
        }
    }
    string Throwdice(int n, int m, int* a, int aLen, int* b, int bLen) {
        // write code here
        if(solve(a,n)>solve(b,n)) {
            return "Happy";
        }else return "Sad";
    }
};