• NOIP 前夕 模板整理


    归并排序:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 int a[1200],s[1200],n;
     6 void megre_sort(int l,int r)
     7 {
     8     if(l==r) return ;
     9     int mid=(l+r)/2;
    10     megre_sort(l,mid);megre_sort(mid+1,r);
    11     int i=l,j=mid+1,k=l;
    12     while(i<=mid&&j<=r)
    13     {
    14         if(a[i]<=a[j])
    15           s[k++]=a[i++];
    16         else
    17           s[k++]=a[j++];
    18     }
    19     while(i<=mid)
    20       s[k++]=a[i++];
    21     while(j<=r)
    22       s[k++]=a[j++];
    23     for(int i=1;i<=r;i++)
    24       a[i]=s[i];
    25 }
    26 int main()
    27 {
    28     scanf("%d",&n);
    29     for(int i=1;i<=n;i++)
    30       scanf("%d",&a[i]);
    31     megre_sort(1,n);
    32     for(int i=1;i<=n;i++)
    33       printf("%d ",a[i]);
    34     return 0;
    35 }

    高精度:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 int a[100],b[100],c[100],len1,len2;
     6 char s1[100],s2[100],s3[100];
     7 void add()
     8 {    
     9     for(int i=0;i<len1;i++)
    10       a[len1-i]=s1[i]-'0';
    11     for(int i=0;i<len2;i++)
    12       b[len2-i]=s2[i]-'0';
    13     int lenc=1,x=0;
    14     while(lenc<=len1||lenc<=len2)
    15     {
    16         c[lenc]=a[lenc]+b[lenc]+x;
    17         x=c[lenc]/10;
    18         c[lenc]%=10;
    19         lenc++;
    20     }
    21     c[lenc]=x;
    22     if(c[lenc]==0)
    23       lenc--;
    24     for(int i=lenc;i>=1;i--)
    25       cout<<c[i];
    26     cout<<endl;
    27 }
    28 void jian()
    29 {
    30     memset(c,0,sizeof(c));memset(a,0,sizeof(a));memset(b,0,sizeof(b));
    31     if(strlen(s1)<strlen(s2)||((strlen(s1)==strlen(s2))&&strcmp(s1,s2)<0))
    32     {
    33         strcpy(s3,s1);strcpy(s1,s2);strcpy(s2,s3);
    34         cout<<'-';
    35     }
    36     len1=strlen(s1);len2=strlen(s2);
    37     for(int i=0;i<len1;i++)
    38       a[len1-i]=s1[i]-'0';
    39     for(int i=0;i<len2;i++)
    40       b[len2-i]=s2[i]-'0';
    41     int lenc=1;
    42     while(lenc<=len1||lenc<=len2)
    43     {
    44         if(a[lenc]<b[lenc])
    45         {
    46             a[lenc]+=10;a[lenc+1]--;
    47         }
    48         c[lenc]=a[lenc]-b[lenc];
    49         lenc++;
    50     }
    51     while(c[lenc]==0&&lenc>1)
    52       lenc--;
    53     for(int i=lenc;i>=1;i--)
    54       cout<<c[i];
    55     cout<<endl;
    56 }
    57 void cheng()//高精乘 
    58 {
    59     for(int i=0;i<len1;i++)
    60       a[len1-i]=s1[i]-'0';
    61     for(int i=0;i<len2;i++)
    62       b[len2-i]=s2[i]-'0';
    63       memset(c,0,sizeof(c));
    64       for(int i=1;i<=len1;i++)
    65       {
    66         int x=0;
    67             for(int j=1;j<=len2;j++)
    68             {
    69                 c[i+j-1]=a[i]*b[j]+x+c[i+j-1];
    70                 x=c[i+j-1]/10;
    71                 c[i+j-1]%=10;
    72         }
    73         c[i+len2]=x;
    74     }
    75       int lenc=len1+len2;
    76       while(c[lenc]==0&&lenc>1) lenc--;
    77     for(int i=lenc;i>=1;i--)
    78       printf("%d",c[i]);
    79     printf("
    "); 
    80 }
    81 int main()
    82 {
    83     gets(s1);gets(s2);
    84     len1=strlen(s1);len2=strlen(s2);
    85     add();
    86     jian();
    87     cheng();
    88     return 0;
    89 }

    二分答案:

      跳石头

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 int l;
     6 int n,m,a[50010];
     7 int check(int x)
     8 {
     9     int k=0,last=0;
    10     for(int i=1;i<=n;i++)
    11     {
    12         if(a[i]-last<x)
    13           k++;
    14         else
    15           last=a[i];
    16     }
    17     if(k>m) return 0;
    18     else return 1;
    19 }
    20 int main()
    21 {
    22     scanf("%d%d%d",&l,&n,&m);
    23     for(int i=1;i<=n;i++)
    24       scanf("%d",&a[i]);
    25     n++;a[n]=l;
    26     int left=1,right=l,mid;
    27     while(left<=right)
    28     {
    29         mid=(left+right)/2;
    30         if(check(mid)) left=mid+1;
    31         else right=mid-1;
    32     }
    33     printf("%d",left-1);
    34     return 0;
    35 }

     Floyd:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 int f[510][510],n,map[510][510],t;
     6 int main()
     7 {
     8     cin>>n;
     9     memset(map,0x3f,sizeof(map));
    10     for(int i=1;i<=n;i++)
    11       for(int j=1;j<=n;j++)
    12         scanf("%d",&map[i][j]);
    13     for(int k=1;k<=n;k++)
    14       for(int i=1;i<=n;i++)
    15         for(int j=1;j<=n;j++)
    16           if(i!=j&&j!=k&&k!=i&&map[i][k]+map[k][j]<map[i][j])
    17           map[i][j]=map[i][k]+map[k][j];
    18     scanf("%d",&t);
    19     while(t--)
    20     {
    21         int x,y;
    22         scanf("%d%d",&x,&y);
    23         printf("%d
    ",map[x][y]);
    24     }
    25     
    26     return 0;
    27 }

     SPFA:

     

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<queue>
     5 #define N 510
     6 using namespace std;
     7 int map[N][N],dis[N],n,m;
     8 bool exist[N];
     9 int SPFA(int x,int y)
    10 {
    11     queue<int> q;
    12     memset(dis,0x3f,sizeof(dis));memset(exist,false,sizeof(exist));
    13     q.push(x);dis[x]=0;exist[x]=true;
    14     while(!q.empty())
    15     {
    16         int h=q.front();q.pop();exist[h]=false;
    17         for(int i=1;i<=n;i++)
    18         {
    19             if(dis[i]>dis[h]+map[h][i])
    20             {
    21                 dis[i]=dis[h]+map[h][i];
    22                 if(exist[i]==false)
    23                     q.push(i),exist[h]=true;
    24             }
    25         }
    26     }
    27     return dis[y];
    28 }
    29 int main()
    30 {
    31     scanf("%d",&n);
    32     for(int i=1;i<=n;i++)
    33       for(int j=1;j<=n;j++)
    34         scanf("%d",&map[i][j]);
    35     scanf("%d",&m);
    36     while(m--)
    37     {
    38         int x,y;
    39         scanf("%d%d",&x,&y);
    40         printf("%d
    ",SPFA(x,y));
    41     }
    42     return 0;
    43 }

    Dijkstra:

     

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<ctime>
     5 using namespace std;
     6 int n,map[510][510],dis[510];
     7 bool exist[510];
     8 int dij(int x,int y)
     9 {
    10     dis[x]=0;
    11     for(int i=1;i<=n;i++)
    12     {
    13         int k=0,minl=0x5f;
    14         for(int j=1;j<=n;j++)
    15             if(exist[j]==false&&dis[j]<minl)
    16                 minl=dis[j],k=j;
    17         if(k==0) break;
    18         exist[k]=true;
    19         for(int j=1;j<=n;j++)
    20             if(dis[j]>dis[k]+map[k][j])
    21              dis[j]=dis[k]+map[k][j];
    22     }
    23     return dis[y];
    24 }
    25 int main()
    26 {    
    27     scanf("%d",&n);
    28     for(int i=1;i<=n;i++)
    29       for(int j=1;j<=n;j++)
    30         scanf("%d",&map[i][j]);
    31     int t;
    32     scanf("%d",&t);
    33     while(t--)
    34     {
    35         int x,y;
    36         scanf("%d%d",&x,&y);
    37         memset(dis,0x3f,sizeof(dis));
    38         memset(exist,false,sizeof(exist));
    39         printf("%d
    ",dij(x,y));
    40     }
    41     return 0;
    42 }

    并查集:

     

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 int fa[10000],n,m,q;
     5 int find(int x)
     6 {
     7     if(fa[x]==x) return fa[x];
     8     else return fa[x]=find(fa[x]);
     9 }
    10 void un(int x,int y)
    11 {
    12     int rx=find(x),ry=find(y);
    13     if(rx!=ry) fa[rx]=ry;
    14 }
    15 int main()
    16 {
    17     scanf("%d%d",&n,&m);
    18     for(int i=1;i<=n;i++)
    19       fa[i]=i;
    20     for(int i=1,x,y;i<=m;i++)
    21     {
    22         scanf("%d%d",&x,&y);
    23         int rx=find(x),ry=find(y);
    24         if(rx==ry) continue;
    25         else un(rx,ry);
    26     }
    27     scanf("%d",&q);
    28     while(q--)
    29     {
    30         int x,y;
    31         scanf("%d%d",&x,&y);
    32         int rx=find(x),ry=find(y);
    33         if(rx==ry) printf("Yes
    ");
    34         else printf("No
    ");
    35     }
    36     
    37     return 0;
    38 }

     Kursual:

     

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 struct node{
     7     int from,to,value;
     8     bool operator < (const node &a)const
     9     {
    10         return value<a.value;
    11     }
    12 }e[1000*2];
    13 int n,m,fa[1000*2];
    14 int find(int x)
    15 {
    16     if(fa[x]==x) return fa[x];
    17     else return fa[x]=find(fa[x]);
    18 }
    19 int main()
    20 {
    21     scanf("%d%d",&n,&m);
    22     for(int x,y,z,i=1;i<=m;i++)
    23     {
    24         scanf("%d%d%d",&x,&y,&z);
    25         e[i].from=x;e[i].to=y;e[i].value=z;
    26     }
    27     sort(e+1,e+m+1);
    28     int cnt=0,MST=0;
    29     for(int i=1;i<=n;i++)
    30       fa[i]=i;
    31     while(cnt<=n-1)
    32     {
    33         cnt++;
    34         int x=e[cnt].from,y=e[cnt].to;
    35         int rx=find(x),ry=find(y);
    36         if(rx==ry) continue;
    37         else{
    38             fa[rx]=ry;MST+=e[cnt].value;
    39         }
    40     }
    41     printf("%d",MST);
    42     return 0;
    43 } 

     Prim:

      

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 int n,map[510][510],dis[510],mst;
     6 bool exist[510];
     7 int main()
     8 {
     9     scanf("%d",&n);
    10     for(int i=1;i<=n;i++)
    11       for(int j=1;j<=n;j++)
    12         scanf("%d",&map[i][j]);
    13     memset(exist,true,sizeof(exist));
    14     memset(dis,0x3f,sizeof(dis));
    15     dis[1]=0;
    16     for(int i=1;i<=n;i++)
    17     {
    18         int k=0;
    19         for(int j=1;j<=n;j++)
    20           if(exist[j]==true&&dis[j]<dis[k])
    21             k=j;
    22         exist[k]=false;
    23         for(int j=1;j<=n;j++)
    24         {
    25             if(exist[j]&&map[k][j]<dis[j])
    26               dis[j]=map[k][j];
    27         }
    28     }
    29     for(int i=1;i<=n;i++)
    30       mst+=dis[i];
    31     printf("%d",mst);
    32     return 0;
    33 }

     拓扑:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<queue>
     5 #define N 510
     6 using namespace std;
     7 int ru[N],map[N][N],n,m;
     8 queue<int> q;
     9 int main()
    10 {
    11     scanf("%d%d",&n,&m);
    12     memset(ru,0,sizeof(ru));
    13     memset(map,0,sizeof(map));
    14     for(int x,y,i=1;i<=n;i++)
    15     {
    16         scanf("%d%d",&x,&y);
    17         map[x][y]=1;
    18         ru[y]++;
    19     }
    20     for(int i=1;i<=n;i++)
    21       if(ru[i]==0)
    22           q.push(i); 
    23     while(!q.empty())
    24     {
    25         int x=q.front();q.pop();
    26         cout<<x<<' ';
    27         for(int i=1;i<=n;i++)
    28         {
    29             if(map[x][i]==1)
    30               ru[i]--;
    31             if(ru[i]==0)
    32               q.push(i);
    33         }
    34     }
    35     return 0;
    36 }

     分解质因数:

     

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<ctime>
    using namespace std;
    int n,ss[520],a[520],head;
    bool ff[65000];
    bool sss(int k)
    {
        bool yes=true;
        for(int i=2;i<k;i++)
          if(k%i==0)
            yes=false;
        if(yes==false)
        {
            ff[k]=1;
            return 0;
        }
        else{
            head++;
            a[head]=k;
            for(int i=1;i*k<64000;i++)
              ff[i*k]=1;
            return 1;
        }
    }
    void printff(int pp)
      {
          printf("%d=",n);
          for(int i=1;i<pp;i++)
            {
                printf("%d*",ss[i]);
            }
        printf("%d
    ",ss[pp]);
      }
    
    void dfs(int k,int m,int p)
    {
        for(int i=m;i<=head;i++)
          if(k%a[i]==0)
          {
               if(k/a[i]==1)
               {
                  ss[p]=a[i];printff(p);
                  exit(0);// 在搜索中卡时啥的比较有用,由搜索直接退出
             }
             else{
                 ss[p]=a[i];
                 dfs(k/a[i],i,p+1);
             }
          }
    }
    int main()
    {
        for(int i=2;i<=300;i++)
          if(ff[i]==0)
            sss(i);
        scanf("%d",&n);
        dfs(n,1,1);
        return 0;
    }

    // 其实这个题暴力枚举就好了

  • 相关阅读:
    不同权限访问详细细节
    文件搜索器
    java中依赖、关联、聚合
    子类重写父类成员方法
    java中子类对父类中的私有变量和私有方法有拥有权无使用权
    shell脚本在CentOS7自动更包
    LR虚拟用户已设置集合点,但controller无法设置集合点策略的解决方案
    LR工具使用之场景设置
    LR集合点策略
    LR录制附件上传后,回放报错
  • 原文地址:https://www.cnblogs.com/suishiguang/p/6065957.html
Copyright © 2020-2023  润新知