6/21 09东北赛热身2

来源:互联网 发布:话不多但语出惊人知乎 编辑:程序博客网 时间:2024/04/30 07:22

Satellite Photographs

DFS/BFS的同时统计一下

 

Max Factor

没看题就被秒,扫了一眼应该是求素数

 

City Skyline

很巧妙的一题,转化到最后代码极短

用一个栈维护,每次读入一个高度y,把栈中>y的都出栈

然后看栈顶如果有==y的则不入栈,否则入栈并答案加一

 

Bovine Birthday

计算某天是星期几,推公式

 

Cow Acrobats

似懂非懂...官方解答是把问题转化成某牛承受上面和自己的重量之和,把重量加到力量上

然后按W+S升序第一优先,W升序第二优先  排序

 

Checking an Alibi

n<=500,Floyd O(n^3)很可能会超时,还是老实打Dijkstra

 

Yogurt factory

f[i]代表第i周的产品由第f[i]周生产

显然取值只可能是i或者f[i-1]

似dp似贪心.....

 

Space Elevator

按最大允许高度排序,然后多重背包,看似O(n*c*h)挺大,实际用时还可以

 

Ombrophobic Bovines

很麻烦的题

 

先用Floyd把所有Farm之间的最短路算出来

 

然后二分答案,构造一个新的图

 

设i点的牛数为a[i],堋数为b[i]

把点i拆为两个点,i1和i2

增加一个源点,其到i1的容量为a[i]

增加一个汇点,其到i2的容量为b[i]

如果i到j的距离小于等于当前二分的值,则i1到j2的容量为MIN(a[i],b[j])

 

点数最多到402,边也很多,邻接矩阵必定超时

要用Dinic,SAP之类"高级"点的最大流算法配上邻接表,FF算法可能超时

 

直观的拆点方法是把一个点拆成a[i]+b[i]个点,然后连边,这样的话点数太多了

 

二分之前可以先统计出所有最短路可能的取值,在这些取值中排序,二分

 

Hopscotch

暴力DFS,只有6位数,可以直接开hash表判重,我是用字符串+set....

 

The Wedding Juicer

感觉可以记忆化搜索,但是消除不了顺序的影响

 

<算法艺术>上有O(n^2*logn)的方法:

初始最外圈加入边界的集合

当集合非空,每次选择一个最小的边界点,然后flood fill,扩展一遍

遇到比它矮的就填,继续搜

遇到比它高的就不继续搜,并把它加入边界集合

 

其中动态取最小用堆维护

 

按我理解本质上是基于优先队列的BFS,里面再套个BFS.....