算法起步(3)抽签问题—合二为一(下)


    我们把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");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值