博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj2165
阅读量:6095 次
发布时间:2019-06-20

本文共 2108 字,大约阅读时间需要 7 分钟。

类似于bzoj1706,考虑到楼层是等价的

我们令f[p,i,j]为用了2^p次电梯,从房间i到j最多上升了多少层
然后从2^p很容易推到2^(p+1),类似于floyd的转移即可
下面我们要用最小的电梯次数
可以考虑每一个数都有其唯一的而二进制拆分
从p到0贪心得到一个最接近上了m层的次数ans,ans+1即为答案

1 const inf=-1000000000000000000; 2 var f:array[0..64,0..100,0..100] of int64; 3     w,v:array[0..100] of int64; 4     e,t,i,j,k,n,p,h:longint; 5     fl:boolean; 6     ans,m:int64; 7  8 function max(a,b:int64):int64; 9   begin10     if a>b then exit(a) else exit(b);11   end;12 13 function check(p:longint):boolean;14   var i:longint;15   begin16     for i:=1 to n do17       if f[p,1,i]>=m then exit(true);18     exit(false);19   end;20 21 begin22   readln(t);23   for e:=1 to t do24   begin25     readln(n,m);26     for i:=1 to n do27     begin28       for j:=1 to n do29       begin30         read(f[0,i,j]);31         if f[0,i,j]=0 then f[0,i,j]:=inf;32       end;33       readln;34     end;35     p:=0;36     while true do37     begin38       for i:=1 to n do39         for j:=1 to n do40         begin41           f[p+1,i,j]:=inf;42           for k:=1 to n do43           begin44             f[p+1,i,j]:=max(f[p+1,i,j],f[p,i,k]+f[p,k,j]);45             if f[p+1,i,j]>m then  46             begin47               f[p+1,i,j]:=m;48               break;49             end;50           end;51         end;52       if not check(p+1) then inc(p)  //出现了从房间1到某房间最大上升层数大于m就不用往下穷举了53       else break;54     end;55     w[1]:=0;56     for i:=2 to n do57       w[i]:=inf;  //w表示在当前所用次数下到i号房间最大上升层数层数58     ans:=0;59     for h:=p downto 0 do60     begin61       fl:=true;62       for i:=1 to n do63       begin64         for j:=1 to n do65           if w[i]+f[h,i,j]>=m then66           begin67             fl:=false;68             break;69           end;70         if not fl then break;71       end;72       if fl then73       begin74         ans:=ans+int64(1) shl h;75         for i:=1 to n do76           v[i]:=inf;77         for i:=1 to n do78           for j:=1 to n do79             v[j]:=max(v[j],w[i]+f[h,i,j]);80         w:=v;81       end;82     end;83     writeln(ans+1);84   end;85 end.
View Code

 

转载于:https://www.cnblogs.com/phile/p/4473025.html

你可能感兴趣的文章
8. 多态——编译时类型&运行时类型
查看>>
逻辑运算
查看>>
Load Balanced 2
查看>>
Angular : 响应式编程, 组件间通信, 表单
查看>>
Python 软件开发目录规范
查看>>
修改OEM SYSMAN密码
查看>>
eclipse的maven、Scala环境搭建
查看>>
Redis配置集群二(window)
查看>>
window.top.location的作用
查看>>
11--PHP中的类和对象
查看>>
. ../ ./ /的意义
查看>>
架构师之路(一)- 什么是软件架构
查看>>
第十二周项目4-点、圆的关系
查看>>
团队项目计划会议
查看>>
使用C3P0连接池
查看>>
iOS汉字中提取首字母
查看>>
设计模式之工厂模式
查看>>
jquery的冒泡和默认行为
查看>>
Check failed: error == cudaSuccess (7 vs. 0) too many resources requested for launch
查看>>
USACO 土地购买
查看>>