jzoj. 1286. 太空电梯

Description

  奶牛们想用K(1<=K<=400)中石块制造一个太空电梯去太空旅行,每种石块有自己的高度h_i(1<=h_i<=100)和数量c_i(1<=c_i<=10),为了避免宇宙射线的干扰,每种石块不能超过最高可以达到的高度a_i(1<=a_i<=40000)。
  帮助奶牛用石块堆积一个最高的太空电梯。

Input

  第1行:一个整数K
  第2到K+1行:每行3个用空格隔开的整数h_i,a_i,c_i

Output

  输出一个高度H,表示最大高度。

Sample Input

3
7 40 3
5 23 8
2 52 6

Sample Output

48

Data Constraint

Hint

【样例说明】
  从上到下依次是6个3号石块、3个1号石块和3个2号石块,注意放4个2号石块在3个1号石块的下面是不行的,因为1号石块最高不能超过40,而现在最上面的1号石块高度达到41,所以不行。

分析:
先把ai从小到大排序。
设f[i,j]为前i种石头,高度为j是否可行,显然是个判定性的dp,转移有点像背包,这里就不说了。

代码:

var
 h,a,c:array [1..401] of longint;
 f:array [0..40001] of boolean;
 k,i,j,n,ans:longint;

procedure qsort(l,r:longint);
  var
    i,j,key,temp:longint;
  begin
    if l>=r then exit;
    i:=l;j:=r;
    key:=a[l+random(r-l+1)];
    repeat
      while  (a[i]<key) do inc(i);
      while  (a[j]>key) do dec(j);
      if i<=j then
      begin
        temp:=a[i];a[i]:=a[j];a[j]:=temp;
        temp:=h[i];h[i]:=h[j];h[j]:=temp;
        temp:=c[i];c[i]:=c[j];c[j]:=temp;
        inc(i);dec(j);
      end;
    until i>j;
    qsort(l,j);
    qsort(i,r);
  end;


begin
 readln(n);
 for i:=1 to n do
  begin
   readln(h[i],a[i],c[i]);
  end;
 qsort(1,n);
 f[0]:=true;
 for i:=1 to n do
  begin
   for j:=a[i] downto 0 do
    begin
     for k:=1 to c[i] do
      begin
       if (j+k*h[i]>a[i]) then break;
       f[k*h[i]+j]:=f[k*h[i]+j] or f[j];
      end;
    end;
  end;
 ans:=0;
 for i:=a[n] downto 0 do
  if f[i] then
   begin
    ans:=i;
    break;
   end;
 writeln(ans);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值