限制 描述
輸入 輸出
樣例輸入
5
1 1 3 6 8
1 2 2 5 5
4 4 0 3 3
8 0 2 3 4
4 3 0 2 1
樣例輸出2
分析
題意是要為僅能上、下、左、右行動的機器找出一條從左上角到右下角的路徑,並且這條路徑上的最大值和最小值之差要最小。
看到題目,先是用dfs直接實現,果不其然tle。又是看了幾遍題目後發現,難度的區間已給出:[0, 120],若用二分的話感覺會優化不少時間,但是應該也要幾百ms。以防萬一我去查了一下其他人的執行時間發現大都只有不到100ms,以為演算法錯了。浪費了好多時間和本來就不多的腦細胞,實在想不出其他較好的方法,就上網查了一下,發現竟然都是二分+dfs,於是敲碼後提交,果然只有16ms…
可能本題的資料比較水,但還是應該「實踐出真知」
二分法需要細心設計一下,附上**:
/*
* nyoj. 306
* date: 2015.8.21
* 16sm 656kb
*/#include
#include
#include
#define max(a,b) a>b ? a : b
#define min(a,b) ausing
namespace
std;
const
int inf = 100000000;
const
int maxl = 110;
const
int direction[4][2] = ;
int arr[maxl][maxl], visited[maxl][maxl];
int n
, tempmindif, tempmaxdif // 當前根據二分法確定的最小值、最
, mindif, maxdif; // 大值整個輸入的最小值、最大值
bool inscale(int x, int y)
bool dfs(int x, int y)
}return
false;
}bool findpath(int key)
return
false;
}int main()
}int bsmid, bsleft = 0, bsright = maxdif - mindif;
while (bsleft <= bsright)
printf("%d\n", bsleft);
}return
0;}
NYOJ 306 走迷宮 二分 搜尋
題意 從 1,1 點到 n,n 找一條路徑 只能上下左右走 使路徑上最大點與最小點差值最小。思路分析 1 這題和我們以前做的迷宮題差別很大,以前做的一般就是求 最小步數或代價最小,乙個dfs或bfs即可,而此題是求最大點與最小點差。2 分析看出,一次dfs和bfs對我等弱菜來說顯然不可 大牛或許可以...
NYOJ306 走迷宮 dfs 二分搜尋
dr.kong設計的機械人卡多非常愛玩,它常常偷偷跑出實驗室,在某個遊樂場玩之不疲。這天卡多又跑出來了,在sjtl遊樂場玩個不停,坐完碰碰車,又玩滑滑梯,這時卡多又走入乙個迷宮。整個迷宮是用乙個n n的方陣給出,方陣中單元格中填充了乙個整數,表示走到這個位置的難度。這個迷宮可以向上走,向下走,向右走...
nyoj306(二分 dfs 好題)
時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述 dr.kong設計的機械人卡多非常愛玩,它常常偷偷跑出實驗室,在某個遊樂場玩之不疲。這天卡多又跑出來了,在sjtl遊樂場玩個不停,坐完碰碰車,又玩滑滑梯,這時卡多又走入乙個迷宮。整個迷宮是 用乙個n n的方陣給出 方陣中 單元格...