做法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";
}
};

京公网安备 11010502036488号