DFS/BFS的同时统计一下
没看题就被秒,扫了一眼应该是求素数
很巧妙的一题,转化到最后代码极短
用一个栈维护,每次读入一个高度y,把栈中>y的都出栈
然后看栈顶如果有==y的则不入栈,否则入栈并答案加一
计算某天是星期几,推公式
似懂非懂...官方解答是把问题转化成某牛承受上面和自己的重量之和,把重量加到力量上
然后按W+S升序第一优先,W升序第二优先 排序
n<=500,Floyd O(n^3)很可能会超时,还是老实打Dijkstra
f[i]代表第i周的产品由第f[i]周生产
显然取值只可能是i或者f[i-1]
似dp似贪心.....
按最大允许高度排序,然后多重背包,看似O(n*c*h)挺大,实际用时还可以
很麻烦的题
先用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]个点,然后连边,这样的话点数太多了
二分之前可以先统计出所有最短路可能的取值,在这些取值中排序,二分
暴力DFS,只有6位数,可以直接开hash表判重,我是用字符串+set....
感觉可以记忆化搜索,但是消除不了顺序的影响
<算法艺术>上有O(n^2*logn)的方法:
初始最外圈加入边界的集合
当集合非空,每次选择一个最小的边界点,然后flood fill,扩展一遍
遇到比它矮的就填,继续搜
遇到比它高的就不继续搜,并把它加入边界集合
其中动态取最小用堆维护
按我理解本质上是基于优先队列的BFS,里面再套个BFS.....