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("\n"); 
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\n",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\n",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\n",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\n");
34         else printf("No\n");
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\n",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;
}

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

posted @ 2016-11-15 15:35  浮华的终成空  阅读(318)  评论(0编辑  收藏  举报

Contact with me