我们把1000代入发现算法的复杂度还是很大
我们还需要继续优化,第一次我们只着眼于第四层循环,现在
我们专注于内层的两层循环
k[c]+k[d] = m - k[a] - k[b]?
如何做?
int n,m;
int k[n * n];
//是否满足条件的标识
bool f = false;
bool binary_search(int x)
//kk[l],k[l+1],k[l+2]....k[r-1]
{
while(r-1>1){
int l=0;
int r=n*n;
int i=(l+r)/2;
if(x>kk[i])
l=i+1;
else if(x==kk[i])
return true;
else
r=i;
}
return false;
}
void solve(){
for(c = 0;c<n;c++){
for(d = 0;d<n;d++){
kk[c*n+d] = k[c] + k[d]
//这里如何理解?举例法,第一轮0+d开始,第二轮便从n开始,所以c*n+d便诞生了
}
}
sort(kk,kk+n*n);
for(a = 0;a<n;a++){
for(b = 0;b<n;b++){
if(binary_search(m-k[a]-k[b])){
f = true;
}
}
}
}
if(f)
puts("Yes");
else
puts("no");
}
算法起步(3)抽签问题—合二为一(下)
最新推荐文章于 2022-11-03 11:57:53 发布