中山培训第二题 2016.7.7

 给你一个长度为N的数组,一个长为K的滑动的窗体从最左移至最右端,你只能见到窗口的K个数,每次窗体向右移动一位,如下表:
  
  你的任务是找出窗口在各位置时的max value,min value.

Input

  第1行n,k,第2行为长度为n的数组

Output

  2行,第1行每个位置的min value,第2行每个位置的maxvalue

Sample Input

8 3

1 3 -1 -3 5 3 6 7

Sample Output

-1 -3 -3 -3 3 3

3 3 5 5 6 7

 

 

const

 maxn=1000000;

var

 n,m,i:longint;

 a:array[1..maxn] of longint;

 ma,mi:array [1..maxn] of longint;

 

 

procedure dmax(var x,dx:longint);

 varj:longint;

  begin

 x:=-maxlongint;

   forj:=i-m+1 to i do

   begin

   ifa[j]>=x then

    begin

     x:=a[j];

    dx:=j;

    end;

   end;

  end;

 

procedure dmin(var y,dy:longint);

 varj:longint;

  begin

 y:=maxlongint;

   forj:=i-m+1 to i do

   begin

   ifa[j]<=y then

    begin

    y:=a[j];

    dy:=j;

    end;

   end;

  end;

 

procedure init;

var j,x,y,dx,dy:longint;

begin

 read(n,m);

 fori:=1 to n do

  read(a[i]);

 i:=m;

 dmax(x,dx); dmin(y,dy);

 ma[i]:=x; mi[i]:=y;

 fori:=m+1 to n do

  begin

   ifdx<=i-m then dmax(x,dx);

   ifdy<=i-m then dmin(y,dy);

   ifa[i]>=x then

    begin

    x:=a[i];

    dx:=i;

    end;

   ifa[i]<=y then

    begin

    y:=a[i];

    dy:=i;

    end;

  ma[i]:=x; mi[i]:=y;

  end;

end;

 

procedure main;

 begin

    fori:=m to n do

    write(mi[i],'');

  writeln;

   fori:=m to n do

    write(ma[i],'');

  end;

 

begin

 init;

 main;

end.

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值