zoukankan      html  css  js  c++  java
  • 抽签问题及优化

    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 }

    呵呵,向着初级篇进军~

  • 相关阅读:
    PAT (Advanced Level) Practise:1008. Elevator
    练习题-二维数组中的查找
    PAT (Basic Level) Practise:1028. 人口普查
    PAT (Basic Level) Practise:1014. 福尔摩斯的约会
    PAT (Basic Level) Practise:1019. 数字黑洞
    c++ 二进制文件读写
    c/c++ linux/windows 读取目录下的所有文件名
    C 语言实现 Linux touch 命令
    c++读写csv
    linux nohup【转】
  • 原文地址:https://www.cnblogs.com/beiyueya/p/12107012.html
Copyright © 2011-2022 走看看