poj1065

【题意】

有n根木棒,已知他们的质量和长度,需对他们进行加工,开机1分钟,加工一根一分钟,

且每次开机后,加工的第i+1根必须比第i根的长度和质量都要大才行,问最短加工时间。

【输入】

第一行T表示T组数据。

每组数据第一行一个N,表示几根木棒。

然后N个二元组,表示每根木棒的长度与质量。

【输出】

对于每组数据,输出最短加工时间。


贪心。

排下序,每次尽可能加工多。


program poj1065;
type
  stick=record
          w,l:longint;
        end;
var
  t,n,i,j,k,q,ans,total,now:longint;
  dl:array [0..5001] of stick;
  yes:array [0..5001] of boolean;
procedure swap (var a,b:stick);
var
  i:stick;
begin
  i:=a;
  a:=b;
  b:=i;
end;
procedure qsort (s,e:longint);
var
  i,j:longint;
  k:stick;
begin
  if s>=e then exit;
  i:=s;
  j:=e;
  k:=dl[(s+e) div 2];
  while i<=j do
    begin
      while (dl[i].w<k.w)or((dl[i].w=k.w)and(dl[i].l<k.l)) do inc(i);
      while (dl[j].w>k.w)or((dl[j].w=k.w)and(dl[j].l>k.l)) do dec(j);
      if i>j then break;
      swap(dl[i],dl[j]);
      inc(i);
      dec(j);
    end;
  qsort(s,j);
  qsort(i,e);
end;
begin
  read(t);
  for q:=1 to t do
    begin
      fillchar(yes,sizeof(yes),false);
      ans:=0;
      read(n);
      for i:=1 to n do
        read(dl[i].w,dl[i].l);
      qsort(1,n);
      total:=0;
      now:=0;
      while total<n do
        begin
          inc(ans);
          for i:=1 to n do
            if (not yes[i])and(dl[i].l>=now) then
              begin
                yes[i]:=true;
                inc(total);
                now:=dl[i].l;
              end;
          now:=0;
        end;
      writeln(ans);
    end;
end.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值