I and OI
Past...

题意:奶牛们要用K个不同类型的石头建太空电梯.每一种石头的高度为Hi,数量为Ci,且不能放在高于Ai的地方,求最高能建多高的太空电梯.

分析:多重背包,数组标记.显然将ai小的放在下面会更优.所以先排序.

code:

const maxh=41000;
var   cnt:array[0..maxh] of longint;
      h,a,c:array[0..401] of longint;
      f:array[0..maxh] of boolean;
      n,i,j,k,tmp,ans:longint;

      procedure swap(var a,b:longint);
      var   tmp:longint;
      begin
            tmp:=a; a:=b; b:=tmp;
      end;

      procedure sort(l,r:longint);
      var   i,j,mid:longint;
      begin
            i:=l; j:=r;
            mid:=a[(l+r)>>1];
            while i<=j do
            begin
                  while a[i]<mid do inc(i);
                  while a[j]>mid do dec(j);
                  if i<=j then
                  begin
                        swap(h[i],h[j]);
                        swap(a[i],a[j]);
                        swap(c[i],c[j]);
                        inc(i); dec(j);
                  end;
            end;
            if i<r then sort(i,r);
            if j>l then sort(l,j);
      end;

begin

      readln(n);
      for i:=1 to n do readln(h[i],a[i],c[i]);
      sort(1,n);

      f[0]:=true;
      for i:=1 to n do
      begin
            fillchar(cnt,sizeof(cnt),0);
            for j:=0 to a[i] do
            if (f[j]=true)and(not f[j+h[i]])and(j+h[i]<=a[i])and(cnt[j]<c[i]) then
            begin
                  f[j+h[i]]:=true;
                  cnt[j+h[i]]:=cnt[j]+1;
            end;
      end;

      for i:=maxh downto 0 do if f[i] then break;
      writeln(i);

end.
posted on 2011-08-12 17:16  exponent  阅读(588)  评论(0编辑  收藏  举报