三、分治算法策略

  • Post author:
  • Post category:其他



1.

麦森数(codevs1087)



题目地址:

http://codevs.cn/problem/1087/



分析:

高精度乘法+快速幂


代码:


type arr=array[0..1000] of integer;

var

p,jj,o,y:longint;

b,c,g:arr;

function wc(m,n:arr):arr;

var i,j,x:longint;

xxx:arr;

begin

fillchar(xxx,sizeof(xxx),0);

for i:=1 to 500  do

begin

x:=0;

for j:=1 to 500 do

begin

xxx[i+j-1]:=xxx[i+j-1]+m[i]*n[j]+x;

x:=xxx[i+j-1] div 10;

xxx[i+j-1]:=xxx[i+j-1] mod 10;

end;

xxx[i+j]:=x;

end;

xxx[0]:=m[0]+n[0];

while (xxx[xxx[0]]=0) and (xxx[0]>1) do dec(xxx[0]);

wc:=xxx;

end;

function kuai(a:longint):arr;

begin

if a=1 then exit(c);

kuai:=kuai(a div 2);

b:=wc(kuai,kuai);

if (a mod 2=0) then exit(b)

else exit(wc(b,c));

end;

begin

readln(p);

c[0]:=1;

c[1]:=2;

g:=kuai(p);

g[1]:=g[1]-1;

y:=trunc(p*ln(2)/ln(10))+1;

write(y);

o:=0;

for jj:=500 downto 1 do

begin

if (jj mod 50=0) then writeln;

write(g[jj]);

end;

writeln;

end.




2.快排核心代码:


procedure cha(l,r:longint);

var i,j,mid,t:longint;

begin

i:=l;

j:=r;

mid:=a[(l+r) div 2];

while i<=j do

begin

while a[i]>mid do inc(i);

while a[j]<mid do dec(j);

if (i<=j) then

begin

t:=a[i];

a[i]:=a[j];

a[j]:=t;

inc(i);

dec(j);

end;

end;

if j>l then cha(l,j);

if i<r then cha(i,r);

end;

总结:

分治策略指的是分而治之的方法。当我们处理大规模问题时,求解可能比较困难,对于这类问题,我们可以将原问题分解成规模较小而结构与原问题相似的子问题,然后递归地解决这些子问题,最后由这些小问题的解构造出原问题的解。一个问题能否用分治法解决,关键是看该问题是否能将原问题分成n个规模较小而结构与原问题相似的子问题。原问题可以分解成多个子问题,这些子问题与原问题相比,只是问题的规模有所降低,其结构和求解方法与原问题相同或相似原问题在分解过程中,递归地求解子问题,由于递归都必须有一个终止条件,因此当分解后的子问题规模足够小时,应该能够直接求解。

分治三个步骤:

分解:将要解决的问题划分成若干个规模较小的同类问题。

求解:当子问题划分得足够小时,用较简单的方法解决

合并:按原问题的要求,将子问题的解逐层合并成原问题的解



版权声明:本文为BOYxiejunBOY原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。