陈凯斌吧 关注:9贴子:84
  • 0回复贴,共1
uses math;
var a,d:array[0..100]of longint;
    b,c:array[1..1000000]of longint;
    k,min1,x,e,s,t,i,j,m,n,l:longint;
procedure f(h1,t1:longint);
var o,x:longint;
begin
    if h1<t1 then
     begin
      i:=h1; j:=t1;
      x:=a[(i+j) shr 1];
      while i<=j do
       begin
        while a[i]<x do inc(i);
        while a[j]>x do dec(j);
        if i<=j then
         begin
          o:=a[i];
          a[i]:=a[j];
          a[j]:=o;
          inc(i);
          dec(j);
         end;
        end;
       f(h1,j); f(i,t1);
      end;
end;
begin
    read(l);
    read(s,t,m);
    min1:=0;
    for i:=1 to m do
     begin read(a[i]); end;
   if s=t then
     begin
      for i:=1 to m do
       if a[i] mod s =0 then inc(min1);
       write(min1); halt;
     end;

  f(1,m); a[m+1]:=l; a[0]:=0; d:=a;
   for i:=1 to m+1 do
    begin
     if d[i]-d[i-1]>500 then a[i]:=a[i-1]+500
     else
     a[i]:=a[i-1]+d[i]-d[i-1];
    end;
  for i:=1 to m do
   inc(b[a[i]]);
  l:=a[m+1];
  for i:=s to l do
    begin
     c[i]:=c[i]+b[i];
     x:=maxlongint;
     for k:=s to t do
      if i-k>=s then
       x:=min(c[i-k],x);
    if x=maxlongint then x:=0;  inc(c[i],x);
   end;
   min1:=maxlongint;
   for i:=l-t to l do
    min1:=min(c[i],min1);
   write(min1);
end.



1楼2007-11-11 23:41回复