归并排序:
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;
}
// 其实这个题暴力枚举就好了
来源:https://www.cnblogs.com/suishiguang/p/6065957.html