description
給定乙個一定存在從起點到終點的路徑的四聯通迷宮。已知tar左右方向移動的時間為1,上下移動的時間為未知實數v。求當tar從起點到終點的最短移動時間為已知實數l時,未知實數v是多少。
input
輸入資料報含多個測試點。第一行為乙個整數t,表示測試點的數目。
對於每乙個測試點,第一行包含實數l和兩個整數r,c。r為迷宮的上下長度,c為迷宮的左右長度。
之後的r行,每行包含c個字元。其中空格表示空地,s表示起點,e表示終點,#表示圍牆。
output
對於每乙個測試點,在單獨的一行內輸出未知實數v,輸出保留5位小數。
sample input
2
2.5 4 5
#####
#s #
# e#
#####
21 13 12
############
#s## #e#
# ## # # #
# # # # #
### # # # #
# # # # #
# ## # # #
## # # # #
### # # # #
## # # # #
# ## # #
# # #
############
sample output
0.50000
0.21053
data constraint
20%的資料,1≤ r,c ≤ 10。
100%的資料,1≤ r,c ≤ 100,0≤ v <10。
分析:未知實數v的增大只能導致距離的增加,而不能導致距離的減小。
所以我們進行二分答案。然後逼近我們要找的值。
相當於已知函式f(x)[最短路徑表示],我們要找到乙個數x,使得x = y0(y0為已知的l)
**
#include #include #include #include #include #define n 40005
#define eps 1e-7
#define inf 1e9
using namespace std;
dequeq;
struct arr
a[n];
double d[n],tim;
char ch[105][105];
int b[105][105],n,m,sum,tot;
int ls[n],s,t;
bool vis[n];
void init()
void add(int x, int y, double w)
void spfa(double v)
}} }
}int main()
}} for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (b[i][j])
double l = 0, r = tim, ans = 0;
while (r - l > eps)
printf("%.5lf\n", ans);
init();
}}
二分 記搜 JZOJ 3522 迷宮花園
description 給定乙個一定存在從起點到終點的路徑的四聯通迷宮。已知tar左右方向移動的時間為1,上下移動的時間為未知實數v。求當tar從起點到終點的最短移動時間為已知實數l時,未知實數v是多少。input 輸入資料報含多個測試點。第一行為乙個整數t,表示測試點的數目。對於每乙個測試點,第一...
JZOJ 二分 抄書
與書的複製差不多 洛谷 書的複製 但是只要輸出最大的時間 樣例輸入9 3 100 200 300 400 500 600 700 800 900樣例輸出1700樣例解釋1 1500 100 200 300 400 500 2 1300 600 700 3 1700 800 900 1300 1500...
二分 抄書 (jzoj 2123)
有n本書,分給m個人抄,每個人只能拿到連續的書 不能把一本書分開 問抄書最多的人要抄多少頁9 3 100 200 300 400 500 600 700 800 9001700對於10 的資料,有n 10 對於50 的資料,有n 500 對於100 的資料,有n 3000 這道題很可能想到dp但會炸...