【题意】
有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.