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; }
// 其实这个题暴力枚举就好了