选数问题

选数问题

  1. 在一个长度为n的k数组中,选出4个数,使其和为m。如果存在,输出yes;否则,输出no。

    1. 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;
                      }
                  }
              }
          }
      }
    2. 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");
    3. 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");
      }

猜你喜欢

转载自www.cnblogs.com/AC-AC/p/12290520.html