标签:int max lse bool while class return puts c++
在一个长度为n的k数组中,选出4个数,使其和为m。如果存在,输出yes;否则,输出no。
O(n^4)的解法
bool f = false;
for(int a = 0; a < n; a++){
    for(int b = 0; b < n; b++){
        for(int c = 0; c < n; c++){
            for(int d = 0; d < n; d++){
                if(k[a]+k[b]+k[c]+k[d]==m){
                    f = true;
                }
            }
        }
    }
}O(n^3logn)的解法
int n,n,k[MAXN]//输入
bool find(int x){
    int l = 0,r = n;
    while(r-l>=1){
        int mid = (l+r)/2;
        if(k[mid]==x) return 1;
        else if(k[mid]<x) l = mid+1;
        else r = mid;
    }
    return 0;
}
void solve(){
    sort(k,k+n);
    bool f = false;
    for(int a = 0; a < n; a++){
        for(int b = 0; b < n; b++){
            for(int c = 0; c < n; c++){
                if(find(m-k[a]-k[b]-k[c])){
                    f = true;
                }
            }
        }
    }
}
if(f) puts("Yes");
else puts("No");O(n^2logn)
//巧妙的运用了数组压缩,很巧妙
int n,m,k[MAXN];
int kk[MAXN*MAXN];
bool find(int x){
    int l = 0,r = n*n;
    while(r-l>=1){
        int mid = (l+r)/2;
        if(kk[mid]==x) return 1;
        else if(kk[i] < x) l = mid+1;
        else r = mid;
    }
    return 0;
}
void solve(){
    for(int c = 0; c < n; c++){
        for(int d = 0; d < n; d++){
            kk[c*n+d] = kk[c]+kk[d];
        }
    }
    sort(kk,kk+n*n);
    bool f = false;
    for(int a = 0; a < n; a++){
        for(int b = 0; b < n; b++){
            if(find(m-k[a]-k[b])){
                f = 1;
            }
        }
    }
    if(f) puts("Yes");
    else puts("No");
}标签:int max lse bool while class return puts c++
原文地址:https://www.cnblogs.com/AC-AC/p/12290520.html