




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
免費(fèi)模板
2010ACM程序競(jìng)賽模板
浙江省第七屆大學(xué)生程序設(shè)計(jì)競(jìng)賽
英文隊(duì)名:OhJack&Rose
中文隊(duì)名:潘多拉星球暴力AC聯(lián)盟
哈嘻嘟
2010年4月17日
目錄
、圄論
哈嘻嘟-浙江省第七屆程序設(shè)計(jì)-2010-4-17
1.1.最小生成樹類prim算法..................................................1
1.2.拓?fù)渑判?...............................................................4
1.3.最短源路徑Folyd實(shí)現(xiàn)...................................................5
1.4.關(guān)鍵路徑實(shí)現(xiàn)算法.......................................................6
1.5.二分圖最大匹配的匈牙利算法.............................................7
1.6.并查集...................................................................9
二、動(dòng)規(guī)...........................................................................................10
2.1.求最長(zhǎng)子序列...........................................................10
2.2.求解最長(zhǎng)升序列長(zhǎng)度及子序列............................................12
2.3.完全背包問題..........................................................13
2.4.0-1背包問題...........................................................14
2.5.母函數(shù)DP算法求組合數(shù).................................................14
2.6.滾動(dòng)數(shù)組求回文串問題..................................................17
三、貪心...........................................................................................18
3.1.時(shí)間安排問題...........................................................18
3.2.求最大子段和..........................................................19
3.3.貪心求最少非遞減序列數(shù)................................................20
四、數(shù)蹌..........................................................................................21
4.1.簡(jiǎn)單求Cnk問題........................................................21
4.2.巧求階乘位數(shù)..........................................................21
4.3.線性算法求素?cái)?shù)........................................................22
五、其他..........................................................................................22
5.1.采用位操作遞歸求解示例.................................................22
5.2.Stack和Queue用法.....................................................23
5.3.map使用詳解...........................................................24
5.4.字典樹建立與查找......................................................24
5.5.KMP匹配算法...........................................................26
5.6.后綴數(shù)組求最長(zhǎng)連續(xù)公共子序列長(zhǎng)度.....................................27
5.7.循環(huán)字符串最小位置表示及同構(gòu)判斷.....................................30
5.8.求哈夫曼樹編碼長(zhǎng)度....................................................32
5.9.堆排序算法............................................................34
5.10.線段樹著色問題.......................................................35
六、附:..........................................................................................38
6.1.C++最值常量...........................................................38
6.2.類型轉(zhuǎn)換................................................................39
6.3.String常用函數(shù)舉例.....................................................39
6.4.C++常用頭文件..........................................................40
一、圖論
1.1.最小生成樹類prim算法
第1頁(yè)
哈嘻嘟-浙江省第七屆程序設(shè)計(jì)-2010-4-17
1.1.1下標(biāo)從1開始
#include<iostream>
#include<cstdio>
#include<algorithm>
usingnamespacestd;
#defineSIZE101
itdefineMAXSIZE10201
intn,nline;/*n個(gè)點(diǎn),nline行關(guān)系*/
intin[SIZE];
structPoint{
intx,y;/*編號(hào)從1開始*/
intv;/*根據(jù)實(shí)際情況更改類型*/
}p[MAXSIZE];/*n*(n-l)/2*/
intcmp(Pointa,Pointb){
returna.v<b.v;
)
intprim(){
intdis,count,i,j;
memset(in,0,sizeof(in));
in[p[l].x]=in[p[l].y]=l;
dis=p[l].v;
count=n-l;
while(count-){/*做n-l次*/
for(j=2;j<nline;j++){
if((in[p[j].x]&&!in[p[j].y])||
(!in[p[j].x]&&in[p[j].y])){
in[pEj].x]=l;
in[p[j].y]=l;
dis+=p[j],v;
break;
returndis;
}
intmain(){
intx,y,v,i;
while(scanf("版T,&n)&&n){
if(n==l){/*有可能輸入的為1個(gè)點(diǎn)*/
printf("0\n");
第2頁(yè)
哈嘻嘟-浙江省第七屆程序設(shè)計(jì)-2010-4-17
continue;
)
nline=n*(n-l)/2+l;
for(i=l;i<nline;i++){
scanf(z/%d%d%d/z,&p[i].x,y,&p[i].v);
)
sort(p+1,p+nline,cmp);
printf("%d\n",prim());
)
return0;
)
1.1.2下標(biāo)從0開始
#include<iostream>
#include<cstdio>
#include<algorithm>
usingnamespacestd;
#defineSIZE101
ttdefineMAXSIZE10201
intn,nline;/*n個(gè)點(diǎn),nline行關(guān)系*/
intin[SIZE];
structPoint{
intx,y;/*編號(hào)從1開始*/
intv;/*根據(jù)實(shí)際情況更改類型*/
}p[MAXSIZE];/*n*(nT)/2*/
intcmp(Pointa,Pointb){
returna.v<b.v;
)
intprim(){
intdis,count,i,j;
memset(in,0,sizeof(in));
in[p[0].x]=in[p[0].y]=l;
dis=p[0].v;
count=n-l;
while(count-){/*做n-1次*/
for(j=l;j<nline;j++){
if((in[p[j].x]&&!in[p[j].y])||
(!in[p[j].x]&&in[p[j].y])){
in[p[j].x]=l;
in[p[j].y]=l;
dis+=p[j].v;
第3頁(yè)
哈嘻嘟-浙江省第七屆程序設(shè)計(jì)-2010-4-17
break;
)
)
)
returndis;
)
intmain(){
intx,y,v,i;
while(scanf&n)&&n){
if(n=l){/*有可能輸入的為1個(gè)點(diǎn)*/
printf(〃0\n〃);
continue;
}
nline=n*(n-l)/2;
for(i=0;i<nline;i++){
scanf(〃%d%d%d〃,x,&p[i].y,&p[i].v);
)
sort(p,p+nline,cmp);
printf(,/%d\n,/,prim());
)
return0;
)
1.2.拓?fù)渑判?/p>
#include<iostream>
#include<cstdio>
#include<cstring>
^defineM501
usingnamespacestd;
intmap[M][M],degree[M];
intne;/*個(gè)數(shù)*/
voidtopo(){
inti,j,k;
for(i=0;i<ne;i++){
j=l;
while(j<=ne&°ree[j])j++;
〃直到一個(gè)度為零的頂點(diǎn),這里不檢查有多個(gè)度為零的情況
〃if(j>ne){break;}不是拓?fù)浣Y(jié)構(gòu)
if(i)printf(〃〃);
printf(/z%d,z,j);
degree
for(k=l;k<=ne;k++){
第4頁(yè)
哈嘻嘟-浙江省第七屆程序設(shè)計(jì)-2010-4-17
degree[k]-=map[j][k];
)
)
printf('\n");
}
intmain(){
inta,b,i,j,nline;/*nline行*/
while(scanf&ne,&nline)!=EOF){
memset(map,0,sizeof(map));
memset(degree,0,sizeof(degree));
while(nline—){
scanf&a,&b);
map[a][b]=l;/*atob*/
)
for(i=l;i<=ne;i++){
for(j=l;j<=ne;j++){
if(map[i][j])degree[j]++;
)
)
topo();/*拓?fù)?/
)
return0;
)
1.3.最短源路徑Folyd實(shí)現(xiàn)
#include<iostream>
#include<cstdio>
#include<cstring>
^defineM201
usingnamespacestd;
intn,map[M][M],start,end;
voidfolyd(){
inti,j,k;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
for(k=0;k<n;k++){
if(map[j][i]==-l||map[i][k]==-l)continue;
if(map[j][k]==-l||map[j][i]+map[i][k]<map[j][k]){
map[j]Lk]=map[j][i]+map[i][k];
)
第5頁(yè)
哈嘻嘟-浙江省第七屆程序設(shè)計(jì)-2010-4-17
)
intmainO{
intnline,i,j,a,b,v;
while(scanf(,z%d%d,z,&n,&nline)!=EOF){
memset(map,-1,sizeof(map));
for(i=0;i<n;i++){
map[i]Li]=0;
)
for(i=0;i<nline;i++){
scanf(z,%d%d%d/z,&a,&b,&v);/*編號(hào)從0開始*/
if(map[a][b]==-11|map[a][b]>v){〃一個(gè)點(diǎn)到另一個(gè)有多條路
map[b][a]=map[a][b]=v;
)
}
scanf(〃%d%d〃,&start,&end);
folydO;
if(map[start][end]!=-l){
printf(〃%d\n〃,map[start][end]);
)
elseprintf(〃-l\n〃);
)
return0;
1.4.關(guān)鍵路徑實(shí)現(xiàn)算法
#include<iostream>
#include<cstdio>
#include<cstring>
#defineM501
usingnamespacestd;
intmap[M][M],degree[M],dp[M];
intne;/*個(gè)數(shù)*/
inttopoplus(){
inti,j,k,maxnum;
for(i=0;i<ne;i++){
J=l;
while(j<=ne&°ree[j])j++;
〃直到一個(gè)度為零的頂點(diǎn),這里不檢查有多個(gè)度為零的情況
//if(j>ne){break;}不是拓?fù)浣Y(jié)構(gòu)
degree
for(k=l;k<=ne;k++){
第6頁(yè)
哈嘻嘟-浙江省第七屆程序設(shè)計(jì)-2010-4-17
if(map[j][k]){
if(map[j][k]+dp[j]>dp[k]){
dp[k]=mapLj][k]+dp[j];
}
degree[k]--;
for(i=0;i<=ne;i++){
if(dp[i]>maxnum){
maxnum=dp[i];
returnmaxnum;
)
intmain(){
inta,b,v,i,j,nline;/*nline行*/
while(scanf(zz%d%d,z,&ne,fenline)!=EOF){
memset(map,0,sizeof(map));
memset(degree,0,sizeof(degree));
memset(dp,0,sizeof(dp));
while(nline—){
scanf&a,&b,&v);
map[a][b]=v;/*atob,v>0*/
)
for(i=l;i<=ne;i++){
for(j=l;j<=ne;j++){
if(map[i][j])degree[j]++;
)
}
printf(,,%d\n,/,topoplus());/*拓?fù)涓倪M(jìn)*/
}
return0;
1.5.二分圖最大匹配的匈牙利算法
#include<iostream>
#include<cstdio>
第7頁(yè)
哈嘻嘟-浙江省第七屆程序設(shè)計(jì)-2010-4-17
#defineN301
usingnamespacestd;
intisuse[N];〃記錄y中節(jié)點(diǎn)是否使用
intlk[N];〃記錄當(dāng)前與y節(jié)點(diǎn)相連的x的節(jié)點(diǎn)
intmat[N][N];//記錄連接x和y的邊,如果i和j之間有邊則為1,否則為0
intgn,gm;〃二分圖中x和y中點(diǎn)的數(shù)目
intcan(intt){
inti;
for(i=l;i<=gm;i++){〃下標(biāo)從1開始
if(isuse[i]==0&&mat[t][i]){
isuse[i]=l;
if(lk[i]==-l||can(lk[i])){
lk[i]=t;
return1;
)
)
)
return0;
)
intMaxMatchO{
inti,num=0;
memset(Ik,-1,sizeof(Ik));
for(i=l;i<=gn;i++){
memset(isuse,0,sizeof(isuse));
if(can(i))num++;
)
returnnum;
)
intmainO{
intt,i,j,k,tmp;
scanf(〃%d〃,&t);
while(t--){
scanf(〃%d%d〃,&gn,&gm);
memset(mat,0,sizeof(mat));〃主要得到mat這個(gè)數(shù)組
for(i=l;i<=gn;i++){
scanf&k);
for(j=l;j<=k;j++){
scanf(〃%d〃,&tmp);
[tmp]=1;〃注意從1開始
第8頁(yè)
哈嘻嘟-浙江省第七屆程序設(shè)計(jì)-2010-4-17
if(MaxMatch()==gn){
printf("YES\n");
)
elseprintf("N0\n");
)
return0;
)
/*
In:
2
33
3123
212
11
33
213
213
11
Out:
YES
NO
*/
1.6.并查集
#include<iostream>
#include<cstdio>
usingnamespacestd;
constintN=1010;
intpre[N];
voidMerge(intx,inty){
inti,t,rx=x,ry=y;
while(pre[rx]!=-1)〃搜索x的樹根
rx=pre[rx];
while(pre[ry]!=T)〃搜索y的樹根
ry=pre[ry];
i=x;
〃壓縮x
while(pre[i]!=-l){
t=pre[i];
pre[i]=rx;
i=t;
}
i=y;〃壓縮y
while(preLi]!=-l){
第9頁(yè)
哈嘻嘟-浙江省第七屆程序設(shè)計(jì)-2010-4-17
t=pre[i];
pre[i]=rx;
i=t;
)
if(ry!=rx)//合并
pre[ry]=rx;
return;
)
intmain(){
intx,y,i,ans,n,m;
while(scanf("%d",&n)&&n){
scanf(線d",&m);
memset(pre,-1,sizeof(pre));
for(i=0;i<m;i++){
〃x與y連通
scanf(z/%d%d”,&x,&y);
Merge(x,y);
)
ans=0;
for(i=l;i<=n;i++)
if(pre[i]==-l)
ans++;
printf("96d\n”,ans'l);
/*
http://acm.hdu.edu.cn/showproblem.php?pid=1232
in:
42
13
43
9990
0
out:
1
998
*/
二、動(dòng)機(jī)
2.1.求最長(zhǎng)子序列
#include<iostream>
第10頁(yè)
哈嘻嘟-浙江省第七屆程序設(shè)計(jì)-2010-4-17
#include<cstdio>
#defineM1001
usingnamespacestd;
chara[M],b[M];
intdp[M+l][M+l],lena,lenb;
voidinit(){
inti,j;
for(i=0;i<=lena;i++){
for(j=0;j<=lenb;j++){
dp[i][j]=0;
)
)
)
intcmax(intx,inty){
returnx>y?x:y;
)
intmain(){
inti,j,len;
//,,
while(scanf(%s>a)!=E0F){
scanfb);
init();
〃下面這步很重要,否則會(huì)超時(shí)
lena=strlen(a);
lenb=strlen(b);
for(i=0;i<lena;i++){
for(j=0;j<lenb;j++){
if(a[i]==b[j]){
dp[i+l][j+l]=dp[i][j]+l;
)
else{
dp[i+l][j+l]=cmax(dp[i][j+1],dp[i+l][j]);
}
)
)
〃子序列長(zhǎng)度
printf("%d\n",dp[i][j]);
/*打印出子序列*/
len=l;
for(i=l;i<=lena;i++){
for(j=l;j<=lenb;j++){
if(len==dp[i][j]){
printf("枇",a[i-l]);
len++;
第11頁(yè)
哈嘻嘟-浙江省第七屆程序設(shè)計(jì)-2010-4-17
break;
printf(〃\n〃);
)
return0;
2.2.求解最長(zhǎng)升序列長(zhǎng)度及子序列
#include<iostream>
#include<cstdio>
ftdefineM1001
usingnamespacestd;
inta[M],dp[M];
voidinit(intn){
inti;
for(i=0;i<n;i++){
dp[i]=l;
)
}
intlis(intn){
inti,j,maxlen=l;//初始長(zhǎng)度為1
for(i=n-2;i>=0;i—){
for(j=n-l;j>i;j—){
if(a[i]<a[j]){
if(dp[j]+l>dp[i]){
dp[i]=dp[j]+l;
)
if(dp[i]>maxlen)maxlen=dpLi];
returnmaxlen;
)
voidshowlis(intn,intmaxlen){
inti;
for(i=0;i<n;i++){
if(dp[i]==maxlen){
printf("96d”,a[i]);
maxlen―;
第12頁(yè)
哈嘻嘟-浙江省第七屆程序設(shè)計(jì)-2010-4-17
printf(〃\n〃);
intmainO{
intt,n,i,maxlen;
scanf(〃%d〃,&t);
while(t-){
/*l<=n<=1000*/
scanf(〃%d〃,&n);
for(i=0;i<n;i++){
scanf(〃%d〃,&a[i]);
}
init(n);
maxlen=lis(n);
printf(〃%d\n〃,maxlen);
〃顯示最長(zhǎng)升序列
showlis(n,maxlen);
)
return0;
2.3.完全背包問題
#include<iostream>
#include<cstring>
#include<cstdio>
usingnamespacestd;
inttype□={150,200,350};〃種類
intdpClOOOl];
intmax(inta,intb){
returna>b?a:b;
)
intmainO{
intt,n,i,j;
scanf(〃%d〃,&t);
while(t--){
scanf(〃%d〃,&n);
memset(dp,0,sizeof(dp));
for(i=0;i<3;i++){
for(j=type[i];j<=n;j++){
〃剩余容量為j時(shí)裝的東西量最大
dp[j]=max(dp[j],dp[j-type[i]]+type[i]);
printf(,z%d\n,z,n-dp[n]);
第13頁(yè)
哈嘻嘟-浙江省第七屆程序設(shè)計(jì)-2010-4-17
}
return0;
2.4.0-1背包問題
#include<iostream>
#include<cstdio>
#include<cstring>
#defineM1002
usingnamespacestd;
intval[M],wei[M],dp[M][M];
intcmax(inta,intb){
returna>b?a:b;
)
intmain(){
intt,n,w,i,j;
scanf(〃%d〃,&t);
while(t--){
scanf(〃%d%d〃,&n,&w);
for(i=l;i<=n;i++){
scanf(〃刎〃,&val[i]);
}
for(i=l;i<=n;i++){
scanf(級(jí)d〃,&wei[i]);
)
memset(dp,0,sizeof(dp));
for(i=l;i<=n;i++){
for(j=0;j<=w;j++){
if(j>=wei[i])
dp[i][j]=cmax(dp[i-l][j-wei[i]]+val[i],dp[i-l][j]);
elsedp[i][j]=dp[i-l][j];
)
}
printfr%d\n",dp[n][w]);
)
return0;
2.5.母函數(shù)DP算法求組合數(shù)
2.5.1.求母函數(shù)各系數(shù)值DP
Sinclude<iostream>
#defineM17
第14頁(yè)
哈嘻嘟-浙江省第七屆程序設(shè)計(jì)-2010-4-17
#defineMAX305
usingnamespacestd;
intcl[MAX],c2[MAX],add[M+l];〃add口保存M種類
voidinit(){
inti;
for(i=l;i<=M;i++){
add[i]=i*i;
}
)
intsolve(intn)
(
inti,j,k;
〃cl[k],c2[k]表示展開式中x~k的系數(shù)
memset(cl,0,sizeof(cl));
memset(c2,0,sizeof(c2));
cl[0]=c2[0]=l;
〃使用前i種幣時(shí)的情況,也即母函數(shù)展開前i個(gè)多項(xiàng)式的乘積
for(i=l;i<=M;i++){
〃求新的多項(xiàng)式中的系數(shù)
for(j=0;j<n;j++){
for(k=l;j+k*add[i]<=n;k++){
c2[j+k*add[i]]+=c1[j];
)
)
for(k=0;k〈=n;k++){〃滾動(dòng)數(shù)組
cl[k]=c2[k];
)
)
returncl[n];
)
intmain(){
intn;
init();
while(scanf("%d",&n)&&n){
printf("%d\n",solve(n));
}
return0;
}
2.5.2.狀態(tài)繼承類DP求某個(gè)和是否存在
#include<cstdio>
#include<iostream>
#include<cstring>
usingnamespacestd;
第15頁(yè)
哈嘻嘟-浙江省第七屆程序設(shè)計(jì)-2010-4-17
booldp[250002];
intval[101],num[101];〃對(duì)應(yīng)的值和數(shù)量
intmain(){
intn,i,j,sum,k;
while(scanf&n)&&n〉0){
sum=0;
for(i=0;i<n;i++){
scanf("%d%d”,&val[i],&num[i]);
sum+=val[i]*num[i];
)
//dp中保存所有可能的組合
memset(dp,0,sizeof(dp));
dp[0]=l;
〃遍歷n種物品
for(i=0;i<n;i++){
〃對(duì)區(qū)間求
for(j=sum/2;j>=0;j—){
if(!dp[j]){
for(k=l;k<=num[i]&&k*val[i]<=j;k++){
dp[j]=dp[j-k*val[i]];
)
)
)
)
for(i=sum/2;i>=0;i一){
if(dp[i]){
printf(,z%d%d\n,z,sum-i,i);
break;
)
)
)
return0;
)
/*
in:
2
101
201
3
101
202
301
-1
out:
第16頁(yè)
哈嘻嘟-浙江省第七屆程序設(shè)計(jì)-2010-4-17
2010
4040
*/
2.6.滾動(dòng)數(shù)組求回文串問題
#include<cstdio>
#include<iostream>
#include<cstring>
SdefineM5001
usingnamespacestd;
charstr[M],rstr[M];
intdp⑵[M];〃滾動(dòng)DP
intcmax(intx,inty){
returnx>y?x:y;
)
intmain(){
intn,i,j,si,s2;
while(scanf(zz%dz,,&n)!=EOF){
scanf(〃%s",str);
〃反轉(zhuǎn)字符數(shù)組
for(i=0;i<n;i++){
rstr[n-i-l]=str[i];
)
rstr[n]=,\0';
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++){
for(j=0;j<n;j++){
sl=i%2;
s2=(i+l)%2;
if(str[i]==rstrLj]){
dp[sl][j+l]=dp[s2][j]+l;
)
else{
dp[sl][j+l]=cmax(dp[s2][j+1],dpLsl][j]);
)
)
}
printf(〃%d\n〃,n-dp[(n-l)%2][n]);
)
return0;
)
/*
http://acm.hdu.edu.cn/showproblem.php?pid=1513
第17頁(yè)
哈嘻嘟-浙江省第七屆程序設(shè)計(jì)-2010-4-17
in:
5
Ab3bd
out:
2
*/
三、貪心
3.1.時(shí)間安排問題
#include<iostream>
#include<cstdio>
#include<algorithm>
#defineM101
usingnamespacestd;
intn;
structPoint{
ints,e;
}p[M];
intcmp(Pointa,Pointb){
if(a.s==b.s)
returna.e<b.e;
elsereturna.s<b.s;
)
intarrange(){
intstart,end,i,count=l;
start=p[0].s;
end=p[0].e;
for(i=l;i<n;i++){
if(p[i].s>=start&&p[i].e<=end){
start=p[i].s;
end=p[i].e;
}
elseif(p[i].s>=end){
count++;
end=p[i].e;
}
)
returncount;
)
intmain(){
inti;
while(scanf(,z%dz,,&n)&&n){
第18頁(yè)
哈嘻嘟-浙江省第七屆程序設(shè)計(jì)-2010-4-17
for(i=0;i<n;i++){
scanf(,z%d%d,z,&p[i].s,&p[i].e);
)
sort(p,p+n,cmp);
printf(〃%d\n〃,arrange());
)
return0;
3.2.求最大子段和
#include<iostream>
usingnamespacestd;
intmainO{
intt,n,i,a[100002];
intbeg,end,x,y,cursum,maxsum;
cin?t;
while(t-){
cin>>n;
for(i=0;i<n;i++){
cin>>a[i];
}
beg=end=l;
cursum=maxsum=a[O];
x=y=l;
for(i=l;i<n;i++){
if(a[i]+cursum<aEi]){
cursum=a[i];
x=i+1;
)
else{
cursum+=a[i];
)
if(cursum>maxsum){
maxsum=cursum;
beg二x;
end=i+l;
)
)
cout?maxsum<<,z,,?beg?z//z?end<<endl;
)
return0;
)
/*
第19頁(yè)
哈嘻嘟-浙江省第七屆程序設(shè)計(jì)-2010-4-17
in:
2
56-154-7
706-11-67-5
out:
1414
716
*/
3.3.貪心求最少非遞減序列數(shù)
#include<iostream>
#include<cstdio>
#include<cstring>
usingnamespacestd;
inta[1001];
intmain(){
intn,i,j,len,count,high;
while(scanf(zz%dz,,&n)!=EOF){
for(i=0;i<n;i++){
scanf(〃%d〃,&a[i]);
}
count=0;
len=n;
while(len){
count++;
high=30005;〃最高值
for(i=0;i<n;i++){
if(a[i]&&a[i]<high){
high=a[i];
a[i]=0;〃標(biāo)記已用值
len一;
)
printf(,/%d\n,/,count);
)
return0;
)
/*
in:
838920715530029917015865
out:
2
第20頁(yè)
哈嘻嘟-浙江省第七屆程序設(shè)計(jì)-2010-4-17
*/
皿、數(shù)是
4.1.簡(jiǎn)單求Cnk問題
#include<iostream>
usingnamespacestd;
intmainO{
intn,k,i;
doublesum;
while(cin>>n?k){
if(n==0&&k==0)break;
if(k>n-k)k=n-k;
sum=l;
for(i=l;i<=k;i++){
sum*二(double)(n-k+i)/i*L000000000001;〃必需要乘
)
cout<<(int)sum<<endl;
)
return0;
4.2.巧求階乘位數(shù)
#include<iostream>
#include<cmath>
usingnamespacestd;
constdoublepi=acos(-l.0);//NOTES:pi
constdoublee=
2.71828182845904523536028747135266249775724709369995957;
intmainO
{
longlongn,tt;
cin?tt;
while(tt--)
(
cin?n;
longlongans=(longlong)
((double)loglO(sqrt(2*pi*n))+n*logl0(n/e))+l;
cout<<ans<<endl;
)
return0;
第21頁(yè)
哈嘻嘟-浙江省第七屆程序設(shè)計(jì)-2010-4-17
4.3.線性算法求素?cái)?shù)
constintMAX=10000000;〃求⑵MAX]間的素?cái)?shù)
boolisprime[MAX+l];
intprime[MAX];〃保存素?cái)?shù)
〃返回素?cái)?shù)表元素總數(shù)
intgetprime(){
inti,j,pnum=0;
//memset(isprime,0,sizeof(isprime));
for(i=2;i<=MAX;i++){
if(!isprimeti])
prime[pnum++]=i;
for(j=0;j<pnum&&prime[j]*i<=MAX;j++){
isprime[prime[j]*i]=l;
if(i%prime[j]==0)break;
)
)
returnpnum;
)
五、其他
5.1.采用位操作遞歸求解示例
#include<iostream>
#include<cstdio>
usingnamespacestd;
unsignedshortin[50001],ste;/*用16位的ste保存16種狀態(tài)*/
unsignedshortpower[]=
{1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768);
intn,m,maxnum,i,j;
voiddfs(ints,intcount){
if(count>maxnum)maxnum=count;
for(i=s;i<m;i++){
if(!(ste&in[i])){/*如果相與為0,說明材料未被使用*/
ste=ste|in[i];
dfs(i+1,count+1);
ste=ste&(^in[i]);
}
)
)
intmain(){
第22頁(yè)
哈嘻嘟-浙江省第七屆程序設(shè)計(jì)-2010-4-17
inttn,t;
while(scanf(zz%d%d,/,&n,&m)!=E0F){
if(n==0||m==0){
printf(〃0\n〃);
continue;
)
for(i=0;i<m;i++){
scanf("%d”,&tn);
in[i]=0;
for(j=l;j<=tn;j++){
scanf("%d",&t);
/*材料編號(hào)降為從0開始,防止益處*/
in[i]=in[i]|power[t-l];
)
)
ste=0;maxnum=0;
dfs(O,0);
printf("%d\n",maxnum);
)
return0;
)
5.2.Stack和Queue用法
#include<iostream>
#include<stack>
#include<queue>
usingnamespacestd;
intmain(){
stack<int>s;
queue<int>q;
inta[]={l,2,3,4);
/*加入*/
for(inti=0;i<4;i++){
s.push(a[i]);
q.push(a[i]);
)
/*讀取stack*/
cout<<z,stack-size://<<s.size()?endl;
for(inti=0;i<4;i++){
cout<<s.top()<<z/"\
s.pop();
}
cout<<endl<<,/queue-size:,z?q.size()<<endl;
第23頁(yè)
哈嘻嘟-浙江省第七屆程序設(shè)計(jì)-2010-4-17
/*讀取queue*/
cout<<,,front:〃<<q?front()〈〈“back:〃<<q.back()<<endl;
for(inti=0;i<4;i++){
cout?q.front()?z/;
q.pop();
)
cout<<endl;
return0;
)
5.3.map使用詳解
#include<iostream>
#include<map>
#include<string>
#include<iterator>
usingnamespacestd;
intmain(){
map<string,int>m;
map<string,int>::iteratorp;
map<string,int>::reverse_iteratorq;
m[〃bd〃]=2;m[〃ba〃]=1;m[〃aa〃]=3;m[〃bd〃]=4;
〃按從小到大遍歷
for(p=m.begin();p!=m.end();p++){〃注意不能使用p<m.end()
cout<<p->first<<,z,z<<p->second<<endl;
)
〃按從大到小遍歷
for(q=m.rbegin();q!=m.rend();q++){
cout<<q->first<<,/zz<<q->second<<endl;
)
m.erase(m.begin());
cout<<m.size()<<endl;
〃清楚全部
m.clear();
cout<<m.empty()<<endl;
return0;
)
5.4.字典樹建立與查找
#include<iostream>
#include<cstring>
#include<cstdio>
第24頁(yè)
哈嘻嘟-浙江省第七屆程序設(shè)計(jì)-2010-4-17
SdefineM26
usingnamespacestd;
intii;〃只在Tree中使用
structTree{
Tree*next[M];
intval;
Tree(){
for(ii=O;ii<M;ii++){
next[ii]=0;
)
val=0;
)
^TreeO(
for(ii=0;ii<M;ii++){
delete(next[ii]);
}
)
};
intmain(){
charword[20];
intlen,i,j,count;
Tree*root=newTree;
Tree*p;
〃建立字典樹過程
while(gets(word)){
if(strcmp(word,〃〃)==0)break;
len=strlen(word);
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年鶴崗師范高等專科學(xué)校單招職業(yè)技能測(cè)試題庫(kù)學(xué)生專用
- 2025至2030年中國(guó)氣動(dòng)交流脈沖式對(duì)焊機(jī)數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 山東省薛城區(qū)中昇2023-2024學(xué)年高三上學(xué)期10月大聯(lián)考地理試題(解析版)
- 2025年剎車離合系統(tǒng)用油合作協(xié)議書
- 第20課《談創(chuàng)造性思維》教學(xué)設(shè)計(jì)-2023-2024學(xué)年統(tǒng)編版語文九年級(jí)上冊(cè)
- 江蘇省2025年普通高中學(xué)業(yè)水平合格性考試地理試題仿真模擬卷01(解析版)
- 2025至2030年中國(guó)有刷電動(dòng)車高速力矩電機(jī)數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025年廣西職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)完美版
- 機(jī)器學(xué)習(xí)原理與應(yīng)用課件 第4章 Logistic回歸
- 2025至2030年中國(guó)探測(cè)模塊數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- GB/T 19830-2023石油天然氣工業(yè)油氣井套管或油管用鋼管
- 思想旗領(lǐng)航向心得體會(huì)
- 律師事務(wù)所章程
- 醫(yī)院合法性審查制度
- 現(xiàn)場(chǎng)簽證流程圖
- (新插圖)人教版四年級(jí)下冊(cè)數(shù)學(xué) 第2招 巧算24點(diǎn) 期末復(fù)習(xí)課件
- 駕駛員違規(guī)違章安全教育談話記錄表
- 2023年10月山東青島開放大學(xué)招考聘用工作人員(第二批)筆試歷年高頻考點(diǎn)試題含答案帶詳解
- 一級(jí)建造師《港口與航道工程管理與實(shí)務(wù)》
- 四年級(jí)下冊(cè)勞動(dòng)《做水果拼盤》
- 工廠車間劃線標(biāo)準(zhǔn)與標(biāo)識(shí)管理(共37張PPT)
評(píng)論
0/150
提交評(píng)論