抽签问题及优化

1,

基础版(n^4)

 1 #include<iostream>
 2 using namespace std;
 3 int n,m,k[100000005];
 4 int main(){
 5     cin>>n>>m;
 6     int p=1; 
 7     for(int i=1;i<=n;i++)
 8        cin>>k[i]; 
 9     for(int a=1;a<=n;a++)
10         for(int b=1;b<n;b++)
11            for(int c=1;c<=n;c++)
12               for(int d=1;d<=n;d++)
13                   if(k[a]+k[b]+k[c]+k[d]==m)
14                      {
15                        p=0;
16                        cout<<"Yes"<<endl;    
17                       } 
18     if(p==1) cout<<"No"<<endl;
19     
20 }

2,(n^3*log(n))

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int n,m,k[100000005];
 5 int bf(int x)
 6 {
 7     int l=0,r=n;
 8     while(r-l>=1)
 9     {
10         int mid=(l+r)/2;
11         if(k[mid]==x) return 1;
12         if(x>k[mid]) l=mid+1;
13         else r=mid;//我之前写的是mid-1但是应该是不能过得
14         
15         return 0; 
16     }
17 }
18 int main(){
19     cin>>n>>m;
20     int p=1; 
21     for(int i=1;i<=n;i++)
22        cin>>k[i]; 
23     sort(k,k+n);
24     for(int a=1;a<=n;a++)
25         for(int b=1;b<n;b++)
26            for(int c=1;c<=n;c++)
27                   if(bf(m-k[a]-k[b]-k[c])==1)
28                      {
29                        p=0;
30                        cout<<"Yes"<<endl;    
31                       } 
32     if(p==1) cout<<"No"<<endl;
33     
34 }

上面忘记写排序的东西了。

写一下sort的用法

Sort函数有三个参数:

(1)第一个是要排序的数组的起始地址。

(2)第二个是结束的地址(最后一位要排序的地址)

(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。

Sort函数使用模板:

Sort(start,end,,排序方法)

对了这个东西包含在#include<algorithm>里面。

3,(n^2log(n))

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int n,m,k[100000005],kk[1000005];
 5 int bf(int x)
 6 {
 7     int l=0,r=n*n;
 8     while(r-l>=1)
 9     {
10         int mid=(l+r)/2;
11         if(kk[mid]==x) return 1;
12         if(x>kk[mid]) l=mid+1;
13         else r=mid;//我之前写的是mid-1但是应该是不能过得
14         
15         return 0; 
16     }
17 }
18 int main(){
19     cin>>n>>m;
20     int p=1; 
21     for(int i=1;i<=n;i++)
22        cin>>k[i]; 
23     for(int i=1;i<=n;i++)
24         for(int j=1;j<=n;j++)
25             kk[(i-1)*n+j]=k[i]+k[j]; //这里的计数挺有意思的 
26     sort(kk,kk+n*n);
27     for(int a=1;a<=n;a++)
28         for(int b=1;b<n;b++)
29                   if(bf(m-kk[a]-kk[b])==1)
30                      {
31                        p=0;
32                        cout<<"Yes"<<endl;    
33                       } 
34     if(p==1) cout<<"No"<<endl;
35     //相比上一个,改的细节挺多的 
36 }

呵呵,向着初级篇进军~

posted @ 2019-12-27 14:11  北月真好  阅读(216)  评论(0编辑  收藏  举报