三、分治算法策略

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个规模较小而结构与原问题相似的子问题。原问题可以分解成多个子问题,这些子问题与原问题相比,只是问题的规模有所降低,其结构和求解方法与原问题相同或相似原问题在分解过程中,递归地求解子问题,由于递归都必须有一个终止条件,因此当分解后的子问题规模足够小时,应该能够直接求解。

分治三个步骤:

分解:将要解决的问题划分成若干个规模较小的同类问题。
求解:当子问题划分得足够小时,用较简单的方法解决
合并:按原问题的要求,将子问题的解逐层合并成原问题的解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值