ACM程序算法模板文档格式.docx
- 文档编号:21057357
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:67
- 大小:35.91KB
ACM程序算法模板文档格式.docx
《ACM程序算法模板文档格式.docx》由会员分享,可在线阅读,更多相关《ACM程序算法模板文档格式.docx(67页珍藏版)》请在冰豆网上搜索。
7.5、冒泡排序49
7.6、快速排序49
7.7、二分搜索50
八、技巧50
8.1、输入技巧50
8.2、递归51
8.3、位运算51
8.4、字典序51
8.5、省略末尾零51
一、组合数学
1.1、重复性全排列算法
#include<
iostream>
algorithm>
usingnamespacestd;
intmain()
{
chars[101];
while(gets(s))
{
intn=strlen(s);
sort(s,s+n);
puts(s);
while(next_permutation(s,s+n))
}
return0;
}
1.2、C(m,n)
intcombination(intm,intn)//m为下标,n为上标
{
if(m<
0||n<
0||m<
n)return-1;
n=n<
(m-n)?
n:
m-n;
if(n==0)return1;
intresult=m;
for(inti=2,j=result-1;
i<
=n;
i++,j--)
{
result=result*j/i;
}
returnresult;
1.3、无重复全组合
stdio.h>
#defineMAX_N10
intn,m;
//输入n个数,其中本质不同的有m个
intrcd[MAX_N];
//记录每个位置填的数
intused[MAX_N];
//标记m个数可以使用的次数
intnum[MAX_N];
//存放输入中本质不同的m个数
voidunrepeat_combination(intl,intp)
inti;
for(i=0;
i<
l;
i++)//每次都输出
printf("
%d"
rcd[i]);
if(i<
l-1)
printf("
"
);
printf("
\n"
for(i=p;
m;
i++)//循环依旧从p开始,枚举剩下的本质不同的数
if(used[i]>
0)//若还可以用,则
{
used[i]--;
//可用次数减1
rcd[l]=num[i];
//在l位置放上该数
unrepeat_combination(l+1,i);
//填下一个位置
used[i]++;
//可用次数恢复
}
intread_data()
inti,j,val;
if(scanf("
&
n)==EOF)
return0;
m=0;
n;
i++)
scanf("
val);
for(j=0;
j<
j++)
if(num[j]==val)
{
used[j]++;
break;
}
if(j==m)
num[m]=val;
used[m]=1;
m++;
return1;
while(read_data())
unrepeat_combination(0,0);
1.4、大数相加
#include<
string.h>
#definemax1000
intnum[max];
charcharA[max];
charcharB[max];
charcharC[max];
voidnumsum(charcharA[],charcharB[],intnum[])//两个要相加的数和最后的结果保存的数组,并且结果存放在C中
memset(num,0,sizeof(num));
intlengthA=strlen(charA);
intlengthB=strlen(charB);
intlengthC=lengthA>
lengthB?
lengthA:
lengthB;
inti,j;
intk=lengthC-1;
i=lengthA-1;
j=lengthB-1;
while(i>
=0&
&
j>
=0)
num[k]=charA[i]+charB[j]-96;
k--;
j--;
i--;
num[k]=charA[i]-48;
while(j>
num[k]=charB[j]-48;
for(i=lengthC-1;
i>
0;
i--)
num[i-1]=num[i-1]+num[i]/10;
num[i]=num[i]%10;
for(i=1;
i<
=lengthC;
i++)
charC[i]=num[i-1]+48;
charC[0]=(charC[1]-48)/10+48;
charC[1]=(charC[1]-48)%10+48;
if(charC[0]!
='
0'
)
%c"
charC[0]);
charC[i]);
while(scanf("
%s%s"
charA,charB)!
=EOF)
numsum(charA,charB,num);
二、数论
2.1、最大公约数
intgcd(intn,intm)//两个数字为参数,输出最大公约数
if(m==0)
returnn;
returngcd(m,n%m);
2.2、乘方取余
longlongexp_mod(longlonga,longlongn,longlongk)//a^n%k,返回余数
longlongt;
if(n==0)return1;
if(n==1)returna%k;
a%=k;
t=exp_mod(a,n>
>
1,k);
t=(t*t)%k;
if(n%2==0)
returnt;
return(t*a)%k;
2.3、进制转换
//10?
?
其他
inttrans(intn,intd,chars[])//数值n,转换成d(2-16)进制表示的字符串s
staticchardigits[]="
0123456789ABCDEF"
;
charbuf[20];
intj,i=19;
if(d<
2||d>
16)
s[0]='
\0'
buf[i]='
do
buf[--i]=digits[n%d];
n/=d;
}while(n);
for(j=0;
(s[j]=buf[i])!
i++,j++);
returnj;
//其他?
10
intn2ten(char*x,intn)//其它进制转化成十进制
char*a;
inti,j,s=0,m=1;
for(i=0;
x[i];
i++);
a=(char*)malloc((i+1)*sizeof(char));
a[i]='
for(j=0,i--;
=0;
i--,j++)
a[j]=x[i];
a[j];
j++)
29{
s+=(int)(a[j]-'
)*m;
m*=n;
returns;
2.4、素数表
boolprimes[100000001];
voidmakeprimes()//素数表的产生,false是素数,这里0,1,2,3默认是。
可自己改动
memset(primes,0,sizeof(primes));
for(j=4;
j<
1001;
j+=2)
primes[j]=true;
for(i=3;
i<
i+=2)if(primes[i]==false)
j=i*i;
if(j<
i)
break;
for(;
j+=2*i)
primes[j]=true;
2.5、素数表精简
boolprimes2[10001];
voidmakeprimes2()//true则是说明是素数
memset(primes2,1,sizeof(primes2));
primes2[0]=primes2[1]=false;
for(i=2;
=10001;
for(j=i+i;
j<
j+=i)
if(primes2[j])
primes2[j]=false;
2.6、N阶乘最后非0位
#defineMAXN1000
intlastdigit(char*buf)
constintmod[20]={1,1,2,6,4,2,2,4,2,8,4,4,8,4,6,8,8,6,8,2};
intlen=strlen(buf),a[MAXN],i,c,ret=1;
if(len==1)
returnmod[buf[0]-'
];
len;
a[i]=buf[len-1-i]-'
for(;
len;
len-=!
a[len-1]){
ret=ret*mod[a[1]%2*10+a[0]]%5;
for(c=0,i=len-1;
i>
i--)
c=c*10+a[i],a[i]=c/5,c%=5;
returnret+ret%2*5;
2.7、约瑟夫环(不带路径)
intYueSeFu(intn,intm)/*输入几个人和每次退出的第几个,返回最后胜利者的编号*/
ints=0;
s=(s+m)%i;
returns+1;
2.8、约瑟夫环(带路径)
#defineMAX10000
inta[MAX];
intm,n,x;
/*n为总人数,从第x个人开始从1到m报数。
*/
intmain()
scanf("
%d%d%d"
&
n,&
x,&
m);
a[i]=i;
for(;
n>
n--)
x=(x+m+n-1)%n;
if(x==0)x=n;
%d"
a[x]);
for(j=x;
j++)a[j]=a[j+1];
}
2.9、质因数分解
voidsolve(intn)
intkey=0,i;
if(n<
0)
key=1;
n=n*-1;
=n/2;
if(n%i==0)
if(key==1)
printf("
-"
key=0;
i);
n=n/i;
i--;
if(n>
1)
%d\n"
n);
2.10、判断是否为质数
boolis_prime(intn)
if(n==1)
returntrue;
intk=sqrt((double)n);
=k;
++i)
if(n%i==0)returnfalse;
2.11、欧拉函数
cmath>
intn;
while(cin>
n&
n)
if(is_prime(n))
cout<
<
n-1<
endl;
else
doubleans=n;
intd=2;
while(n!
=1)
intf=0;
while(n%d==0)
{
f=1;
n=n/d;
}
if(f)
ans*=(double)(1-(double)1/(double)d);
if(d==2)d++;
elsed+=2;
%.0lf\n"
ans);
三、数据结构
3.1、最小代价生成树—普利姆算法
floatprim(intn)/*n是顶点的个数,然后所有的顶点之间的距离保存在matrix中间*/
floatlowcost[101];
booluset[101]={true};
inti,j,k,t;
floatmin,sum=0;
i++)
lowcost[i]=matrix[0][i];
k=0;
min=INT_MAX;
for(j=0;
j++)
{
if(lowcost[j]<
min&
!
uset[j])
{
min=lowcost[j];
t=j;
}
}
sum+=min;
uset[t]=true;
k=t;
if(!
uset[j]&
lowcost[j]<
INT_MAX&
lowcost[j]>
matrix[k][j])
lowcost[j]=matrix[k][j];
returnsum;
四、动态规划
4.1、LIS最长不下降序列的算法
#defineMAX50
intnum[MAX];
intresult[MAX];
intLongest_Increasing(intnum[],intn)//输入数组和其长度,result存放结果数组,返回结果长度
intlis[MAX],i,j;
lis[i]=1;
i;
if(num[i]>
num[j]&
lis[j]+1>
lis[i])
lis[i]=lis[j]+1;
intmaxn=0;
if(maxn<
lis[i])
maxn=lis[i];
intmax=maxn;
for(i=MAX-1;
if(lis[i]==maxn)
result[maxn-1]=num[i];
maxn--;
returnmax;
intmax;
#definemax100020
inta[max];
intB[max];
intresult[max];
intlen;
intLIS(intd[],intn)//输入数组和其长度,result存放结果数组,返回结果长度,下标1开始
memset(B,0,sizeof(B));
intleft,right,mid,i,j;
len=1;
B[1]=d[1];
left=1,right=len;
while(left<
=right)
mid=(left+right)/2;
if(B[mid]<
d[i])left=mid+1;
else
right=mid-1;
B[left]=d[i];
if(left>
len)
len++;
for(j=1;
if(a[j]>
=B[i]&
a[j]<
=B[i+1])
result[i]=a[j];
result[i]=B[i];
returnlen;
intn,i,t;
t);
while(t--&
scanf("
n))
for(i=1;
scanf("
a[i]);
LIS(a,n));
=len;
result[i]);
4.2、交通最短路径算法
intM[7][7]=
0,5,2,0,0,0,0,
0,0,0,3,2,0,0,
0,0,0,0,7,4,0,
0,0,0,0,0,0,4,
0,0,0,0,0,0,3,
0,0,0,0,0,0,5,
0,0,0,0,0,0,0
};
intsum=0,min=10000;
intMD(intplace)//place是到达的最末端,以此开始往前推,M数组是全局变量,存放每个点之间的关系
i=place;
if(i<
if(sum<
min)
min=sum;
if(M[j][i]!
sum+=M[j][i];
MD(j);
sum-=M[j][i];
4.3、数塔最大值算法
voidsolve(inti,intj)//i,j是数塔起始的坐标,a数组是全局定义用来储存数据的数组,max是最大值,s不断变化的和,也是全局变量
s=s+a[i][j];
max=max>
s?
max:
s;
while(i<
n)
solve(i+1,j);
s=s-a[i+1][j];
solve(i+1,j+1);
s=s-a[i+1][j+1];
break;
4.4、最小代价字母树
intdp(intnum[],intlength)//储存数组的数字和该数组的长度
quickSort(num,0,length-1);
if(num[1]==10000)
sum=num[0]+num[1];
result+=sum;
num[0]=num[1]+num[0];
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ACM 程序 算法 模板