roosephu 考题之二: 进制法贪心

            

           又是一道背包......

           这里写的比较好:http://blog.csdn.net/huyuncong/article/details/6884369

           题意不复杂:给定n个背包,m个物品,物品大小不能用dp过,但是有一个很诡异的性质:对于任意两个物品,一定满足一个物品的大小是另一个物品大小的整数倍,求最多可以在背包中放入几个物品。

   

           这里的关键条件:倍数关系,是需要使用进制来考虑的,把物品出现过大小当成进制,最后把背包大小用这种进制来表示,然后从低位往高位贪心即可(说的是相当不清晰啊),这里hyc写得还可以,就进上面那个地址看算了。

    

           

program lmd;
var
  fod,num,sys,bag:array[0..1000000] of int64;
  have:array[0..1000000]of int64;
  tot,i,j,bj,ans,n,m:longint;
procedure inf;
begin
   assign(input,'rumor.in');
   assign(output,'rumor.out');
   reset(input); rewrite(output);
end;
procedure ouf;
begin
   close(input); close(output);
end;
procedure init;
begin
   read(n,m);
   for i:=1 to n do read(bag[i]);
   for i:=1 to m do read(fod[i]);
end;
procedure sort(l,r:longint);
var i,j,x,tmp:longint;
begin
    i:=l; j:=r; x:=fod[(l+r) shr 1];
    repeat
      while fod[i]<x do inc(i);
      while fod[j]>x do dec(j);
      if i<= j then
        begin
           tmp:=fod[i]; fod[i]:=fod[j]; fod[j]:=tmp;
           inc(i); dec(j);
        end;
    until i>j;
    if i<r then sort(i,r);
    if l<j then sort(l,j);
end;
procedure prepare;
begin
   sort(1,m);
   tot:=0;
   for i:=1 to m do
     if fod[i]<>fod[i-1] then
        begin
          inc(tot); sys[tot]:=fod[i];
        end;
   fillchar(num,sizeof(num),0);
   sys[tot+1]:=maxlongint;
   for i:=1 to n do
     begin
       for j:=1 to tot do
         if sys[j]>bag[i] then  break
           else
             inc(num[j],(bag[i] mod sys[j+1]) div sys[j]);
     end;
   for i:=1 to tot do
      have[i]:=sys[i]*num[i];
end;
procedure main;
begin
    bj:=1; ans:=0;
    for i:=1 to m do
      begin
        while ((have[bj]<fod[i]) or (sys[bj]<fod[i])) and (bj<tot) do
          inc(bj);
         if (have[bj]<fod[i]) or (sys[bj]<fod[i]) then break;
        dec(have[bj],fod[i]); inc(ans);
      end;
    write(ans);
end;
begin
   inf;
   init;
   prepare;
   main;
   ouf;
end.                                                                       

阅读更多
文章标签: output input div
个人分类: 贪心
上一篇roosephu 考题之一: 三维偏序
下一篇刷陈题ing @@
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭