选数问题
Posted ac-ac
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了选数问题相关的知识,希望对你有一定的参考价值。
选数问题
在一个长度为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"); }
以上是关于选数问题的主要内容,如果未能解决你的问题,请参考以下文章