NOIP 前夕 模板整理

来源:互联网 发布:监控软件手机版 编辑:程序博客网 时间:2024/05/22 19:24
归并排序:

 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         else17           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         else15           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;}

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

0 0