• bzoj1293


    维护一个小根堆,先把每种珠子的出现第一个位置放入堆中,每次取出彩带最左边的珠子

    放入取出同类珠子的下一颗同种类的珠子,并且更新彩带最优解。

    直到取出的珠子是这类珠子的最右边的一颗时候结束

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

    type link=^node;

         node=record

           loc:longint;

           next:link;

         end;

         point=record

           loc,num:longint;

         end;

     

    var w,b:array[0..70] of link;

        heap:array[0..10010] of point;

        n,k,s,x,i,j,y,t,ans:longint;

        p,q:link;

     

    function min(a,b:longint):longint;

      begin

        if a>b then exit(b) else exit(a);

      end;

     

    procedure swap(var a,b:point);

      var c:point;

      begin

        c:=a;

        a:=b;

        b:=c;

      end;

     

    procedure up(i:longint);

      var j:longint;

      begin

        j:=i shr 1;

        while j>0 do

        begin

          if heap[i].loc<heap[j].loc then

          begin

            swap(heap[i],heap[j]);

            i:=j;

            j:=i shr 1;

          end

          else break;

        end;

      end;

     

    procedure sift(i:longint);

      var j:longint;

      begin

        j:=i shl 1;

        while j<=k do

        begin

          if (j+1<=k) and (heap[j].loc>heap[j+1].loc) then inc(j);

          if heap[i].loc>heap[j].loc then

          begin

            swap(heap[i],heap[j]);

            i:=j;

            j:=i shl 1;

          end

          else break;

        end;

      end;

     

    begin

      readln(n,k);

      for i:=1 to k do

      begin

        read(s);

        w[i]:=nil;

        for j:=1 to s do

        begin

          read(x);

          new(p);

          p^.next:=nil;

          p^.loc:=x;

          if w[i]=nil then

          begin

            w[i]:=p;

            q:=p;

          end

          else begin

            q^.next:=p;

            q:=p;

          end;

        end;

        b[i]:=w[i];

        readln;

      end;

      y:=0;

      for i:=1 to k do

      begin

        t:=t+1;

        heap[t].loc:=b[i]^.loc;

        heap[t].num:=i;

        up(t);

        if heap[t].loc>y then y:=heap[t].loc;

        b[i]:=b[i]^.next;

      end;

      ans:=y-heap[1].loc;

      while true do

      begin

        x:=heap[1].num;

        if b[x]=nil then break

        else begin

          heap[1].loc:=b[x]^.loc;

          if y<b[x]^.loc then y:=b[x]^.loc;   //维护彩带最右端

          b[x]:=b[x]^.next;

          sift(1);

          ans:=min(ans,y-heap[1].loc);

        end;

      end;

      writeln(ans);

    end.

     

  • 相关阅读:
    foundation框架—结构体
    OC语言BLOCK和协议
    OC语言description方法和sel
    OC语言类的本质和分类
    清除浮动的常用方法
    php动态读取数据清除最右边距
    css背景图片定位练习(二): background-position的百分比
    css背景图片定位练习(一)
    行高不设单位的好处 line-height:1.8
    background:transparent的作用
  • 原文地址:https://www.cnblogs.com/phile/p/4473196.html
Copyright © 2020-2023  润新知