标签: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