抽签问题及优化
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 }
呵呵,向着初级篇进军~