简易贪心+heap

注意要用链表

  1 type link=^node;
  2      node=record
  3        loc:longint;
  4        next:link;
  5      end;
  6      point=record
  7        loc,num:longint;
  8      end;
  9 var w,b:array[0..70] of link;
 10     heap:array[0..10010] of point;
 11     n,k,s,x,i,j,y,t,ans:longint;
 12     p,q:link;
 13 
 14 function min(a,b:longint):longint;
 15   begin
 16     if a>b then exit(b) else exit(a);
 17   end;
 18 
 19 procedure swap(var a,b:point);
 20   var c:point;
 21   begin
 22     c:=a;
 23     a:=b;
 24     b:=c;
 25   end;
 26 
 27 procedure up(i:longint);
 28   var j:longint;
 29   begin
 30     j:=i shr 1;
 31     while j>0 do
 32     begin
 33       if heap[i].loc<heap[j].loc then
 34       begin
 35         swap(heap[i],heap[j]);
 36         i:=j;
 37         j:=i shr 1;
 38       end
 39       else break;
 40     end;
 41   end;
 42 
 43 procedure sift(i:longint);
 44   var j:longint;
 45   begin
 46     j:=i shl 1;
 47     while j<=k do
 48     begin
 49       if (j+1<=k) and (heap[j].loc>heap[j+1].loc) then inc(j);
 50       if heap[i].loc>heap[j].loc then
 51       begin
 52         swap(heap[i],heap[j]);
 53         i:=j;
 54         j:=i shl 1;
 55       end
 56       else break;
 57     end;
 58   end;
 59 
 60 begin
 61   readln(n,k);
 62   for i:=1 to k do
 63   begin
 64     read(s);
 65     w[i]:=nil;
 66     for j:=1 to s do
 67     begin
 68       read(x);
 69       new(p);
 70       p^.next:=nil;
 71       p^.loc:=x;
 72       if w[i]=nil then
 73       begin
 74         w[i]:=p;
 75         q:=p;
 76       end
 77       else begin
 78         q^.next:=p;
 79         q:=p;
 80       end;
 81     end;
 82     b[i]:=w[i];
 83     readln;
 84   end;
 85   y:=0;
 86   for i:=1 to k do
 87   begin
 88     t:=t+1;
 89     heap[t].loc:=b[i]^.loc;
 90     heap[t].num:=i;
 91     up(t);
 92     if heap[t].loc>y then y:=heap[t].loc;
 93     b[i]:=b[i]^.next;
 94   end;
 95   ans:=y-heap[1].loc;
 96   while true do
 97   begin
 98     x:=heap[1].num;
 99     if b[x]=nil then break
100     else begin
101       heap[1].loc:=b[x]^.loc;
102       if y<b[x]^.loc then y:=b[x]^.loc;
103       b[x]:=b[x]^.next;
104       sift(1);
105       ans:=min(ans,y-heap[1].loc);
106     end;
107   end;
108   writeln(ans);
109 end.
View Code

 

posted on 2014-04-16 23:13  acphile  阅读(138)  评论(0编辑  收藏  举报