比赛 NOIP2008集训模拟1 评测结果 WEEWAAEEEE
题目名称 地精贸易 最终得分 20
用户昵称 Achilles 运行时间 0.000 s
代码语言 Pascal 内存使用 0.00 MiB
提交时间 2008-11-10 10:41:01
显示代码纯文本
program goblin;
var
  sz1,sz2:array[0..100]of record
    data,data2,num:longint;
  end;
  sz3:array[0..100]of longint;
  hx:array[0..4000{000},0..100]of integer;
  money,mfirst,n,i,j,t1,t2,max,r:longint;
begin
  fillchar(hx,sizeof(hx),0);
  assign(input,'goblin.in');
  assign(output,'goblin.out');
  reset(input);
  rewrite(output);
  readln(money,n);
  mfirst:=money;
  for i:=1 to n do
  begin
    readln(t1,t2);
    t1:=t1-t2;
    if t1<0 then begin
      sz1[0].num:=sz1[0].num+1;
      sz1[sz1[0].num].data:=0-t1;
      sz1[sz1[0].num].data2:=t1+t2;
      sz1[sz1[0].num].num:=i;
    end;
    if t1>0 then begin
      sz2[0].num:=sz2[0].num+1;
      sz2[sz2[0].num].data:=t1;
      sz2[sz2[0].num].data2:=t2;
      sz2[sz2[0].num].num:=i;
    end;
  end;
  max:=0;
  for i:=1 to sz1[0].num do
  begin
    j:=0;
    if (j+sz1[i].data2<money) then begin
      if hx[j,0]+sz1[i].data>=hx[j+sz1[i].data2,0] then begin
        hx[j+sz1[i].data2]:=hx[j];
        hx[j+sz1[i].data2,0]:=hx[j,0]+sz1[i].data;
        hx[j+sz1[i].data2,sz1[i].num]:=hx[j+sz1[i].data2,sz1[i].num]+1;
        if hx[j+sz1[i].data2,0]>max then begin
          max:=hx[j+sz1[i].data2,0];
          r:=j+sz1[i].data2;
        end;
      end;
    end;
    for j:=1 to money do
    begin
      if (hx[j,0]>0)and(j+sz1[i].data2<=money) then begin
        if hx[j,0]+sz1[i].data>hx[j+sz1[i].data2,0] then begin
          hx[j+sz1[i].data2]:=hx[j];
          hx[j+sz1[i].data2,0]:=hx[j,0]+sz1[i].data;
          if hx[j+sz1[i].data2,0]>max then begin
            max:=hx[j+sz1[i].data2,0];
            r:=j+sz1[i].data2;
          end;
          hx[j+sz1[i].data2,sz1[i].num]:=hx[j+sz1[i].data2,sz1[i].num]+1;
        end;
      end;
    end;
  end;
  for i:=1 to n do
    if hx[r,i]<>0 then sz3[i]:=hx[r,i];
  fillchar(hx,sizeof(hx),0);
  money:=money{*2-r}+max;
  max:=0;
  for i:=1 to sz2[0].num do
  begin
    j:=0;
    if (j+sz2[i].data2<=money) then begin
      if hx[j,0]+sz2[i].data>hx[j+sz2[i].data2,0] then begin
        hx[j+sz2[i].data2]:=hx[j];
        hx[j+sz2[i].data2,0]:=hx[j,0]+sz2[i].data;
        hx[j+sz2[i].data2,sz2[i].num]:=hx[j+sz2[i].data2,sz2[i].num]+1;
        if hx[j+sz2[i].data2,0]>max then begin
          max:=hx[j+sz2[i].data2,0];
          r:=j+sz2[i].data2;
        end;
      end;
    end;
    for j:=1 to money do
    begin
      if (hx[j,0]>0)and(j+sz2[i].data2<=money) then begin
        if hx[j,0]+sz2[i].data>hx[j+sz2[i].data2,0] then begin
          hx[j+sz2[i].data2]:=hx[j];
          hx[j+sz2[i].data2,0]:=hx[j,0]+sz2[i].data;
          if hx[j+sz2[i].data2,0]>max then begin
            max:=hx[j+sz2[i].data2,0];
            r:=j+sz2[i].data2;
          end;
          hx[j+sz2[i].data2,sz2[i].num]:=hx[j+sz2[i].data2,sz2[i].num]+1;
        end;
      end;
    end;
  end;
  for i:=1 to n do
    if hx[r,i]<>0 then sz3[i]:=0-hx[r,i];
  writeln(money{*2-r}+max-mfirst);
  for i:=1 to n do
    if sz3[i]=0 then writeln('Buy 0') else begin
      if sz3[i]>0 then writeln('Buy ',sz3[i],' form Aliance') else writeln('Buy ',0-sz3[i],' form Horde');
    end;
  close(input);
  close(output);
end.