抽签的优化_c++

# include <iostream>
# include <cstdio>

int main(){

int n,m;
int k[1000];

scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d",&k[i]);
}

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;

if(f) puts("Yes\n");
else puts("No\n");

return 0;
}

优化1(n^3logn):

# include <iostream>
# include <cstdio>
# include <algorithm>

using namespace std;
bool binary_search(int x);
int k[1000];
int n,m;
int main(){

scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d",&k[i]);
}

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(binary_search(m-k[a]-k[b]-k[c]))
f = true;

if(f) puts("Yes\n");
else puts("No\n");

return 0;
}
bool binary_search(int x){

int left=0,right=n;

while(right-left>=1){
int mid = (left+right)/2;
if(k[mid]==x) return true;
else if(k[mid]<x) left = mid+1;
else right = mid;
}

return false;

}

优化2(n^2logn):

# include <iostream>
# include <cstdio>
# include <algorithm>

using namespace std;
bool binary_search(int x);
int k[1000];
int kk[1000];
int n,m;
int main(){

scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d",&k[i]);
}

for(int c=0;c<n;c++)//保存后两个抽取的
for(int d=0;d<n;d++)
kk[c*n+d] = k[c]+k[d];



sort(kk,kk+n*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(binary_search(m-k[a]-k[b]))
f = true;

if(f) puts("Yes\n");
else puts("No\n");

return 0;
}
bool binary_search(int x){

int left=0,right=n;

while(right-left>=1){
int mid = (left+right)/2;
if(kk[mid]==x) return true;
else if(kk[mid]<x) left = mid+1;
else right = mid;
}

return false;

}