基本算法(3)(pascal)zz

16.查找算法
     折半查找
     function binsearch(k:keytype):integer;
     var low,hig,mid:integer;
     begin
     low:=1;hig:=n;
     mid:=(low+hig) div 2;
     while (a[mid].key< >k) and (low< =hig) do begin
if a[mid].key >k then hig:=mid-1
     else low:=mid+1;
     mid:=(low+hig) div 2;
     end;
     if low >hig then mid:=0;
     binsearch:=mid;
     end;
     
     树形查找
     二叉排序树:每个结点的值都大于其左子树任一结点的值而小于其右子树任一结点的值。
     查找
     function treesrh(k:keytype):pointer;
     var q:pointer;
     begin
     q:=root;
     while (q< >nil) and (q^.key< >k) do
     if k< q^.key then q:=q^.left
else q:=q^.right;
treesrh:=q;
end;


17.KMP算法




18.贪心
*会议问题
(1) n个活动每个活动有一个开始时间和一个结束时间,任一时刻仅一项活动进行,求满足活动数最多的情况。
解:按每项活动的结束时间进行排序,排在前面的优先满足。

(2)会议室空闲时间最少。

(3)每个客户有一个愿付的租金,求最大利润。

(4)共R间会议室,第i个客户需使用i间会议室,费用相同,求最大利润。



附录1 常用技巧
1.带权中位数
我国蒙古大草原上有N(N是不大于100的自然数)个牧民定居点P1(X1,Y1)、P2(X2,Y2)、 …Pn(Xn,Yn),相应地有关权重为Wi,现在要求你在大草原上找一点P(Xp,Yp),使P点到任 一点Pi的距离Di与Wi之积之和为最小。   
   即求 D=W1*D1+W2*D2+…+Wi*Di+…+Wn*Dn 有最小值   
结论:对x与y两个方向分别求解带权中位数,转化为一维。
设最佳点p为点k,则点k满足:
令W为点k到其余各点的带权距离之和,则
sigema( i=1 to k-1) Wi*Di < = W/2
sigema( i=k+1 to n) Wi*Di < = W/2
同时满足上述两式的点k即为带权中位数。

2.求一序列中连续子序列的最大和
begin
maxsum:=-maxlongint;
sum:=0;
for i:=1 to n do begin
inc(sum,data[i]);
if sum >maxsum then maxsum:=sum;
     if sum< 0 then sum:=0;
end;
writeln(maxsum);
end;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值