題目描述
我們把房間按照笛卡爾座標系進行建模之後,每個點就有了乙個座標。
假設現在房子裡有些紙片需要被收集,收集完紙片你還要回歸到原來的位置,你需要制定乙個策略來使得自己行走的距離最短。
你只能沿著 x 軸或 y 軸方向移動,從位置 (i,j) 移動到相鄰位置 (i+1,j),(i-1,j),(i,j+1) 或 (i,j-1) 距離增加 1。
輸入描述:
在第一行中給出乙個t,1≤t≤10t, 1 \le t \le 10t,1≤t≤10, 代表測試資料的組數。
對於每組輸入,在第一行中給出房間大小,第二行給出你的初始位置。
接下來給出乙個正整數 n,1≤n≤10n,1 \le n \le 10n,1≤n≤10 代表紙片的個數。
接下來 n 行,每行乙個座標代表紙片的位置。
保證房間小於 20×2020 \times 2020×20,紙片一定位於房間內。
輸出描述:
對於每組輸入,在一行中輸出答案。
格式參見樣例。
示例1輸入複製1
10 10
1 14
2 35 5
9 46 5
輸出複製
the shortest path has length 24
如下圖最短一定是這些點圍成的圖形的周長
而周長恰好=2倍的(∣y
max−
ymin
∣+∣x
max−
xmin
∣)(|y_-y_|+|x_-x_|)
(∣ymax
−ym
in∣
+∣xm
ax−
xmin
∣)所以只需記錄最小橫座標,最小縱座標,最大橫座標,最大縱座標即可
**如下
#ifdef debug
#include
#include
"/home/majiao/mb.h"
#endif
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define maxn ((int)1e5+7)
#define ll long long int
#define inf (0x7f7f7f7f)
#define fori(lef, rig) for(int i=lef; i<=rig; i++)
#define forj(lef, rig) for(int j=lef; j<=rig; j++)
#define fork(lef, rig) for(int k=lef; k<=rig; k++)
#define qaq (0)
using
namespace std;
#ifdef debug
#define show(x...) \
do while (0)
void
err(
)template
<
typename t,
typename..
. a>
void
err(t a, a.
.. x)
#endif
#ifndef debug
namespace fio
while
(ch >=
'0'&& ch <=
'9')
x *= f;}}
;using
namespace fio;
#endif
int n, m, q, k;
pair<
int,
int> a[maxn]
;int
main()
printf
("the shortest path has length %d\n",(
(maxy-miny)
+(maxx-minx)
)<<1)
;}#ifdef debug
clock_t etime =
clock()
;printf
("rum time: %lf 秒\n",(
double
)(etime-stime)
/clocks_per_sec)
;#endif
return0;
}
牛客演算法周周練7 題解
a 收集紙片 題意 在二維座標中有 n 個點需要你依次到達並最後返回起點,求最短路程 思路 典型的 tsp 旅行商問題,因為 n 最大只有 10 所以我們可以用 dfs 遍歷所有可能的情況,時間複雜度為 o 10 include include include include define inf ...
牛客演算法周周練2
a 題意 求乙個數的順序和逆序之和。題解 其實就是個閹割版的高精度加法嘛。其實逆序數忽略前導零這個條件是沒有用的,因為順序數不可能有前導零,自然結果也不會有,然後注意下首位進製不取餘。include using namespace std int a 10 b 10 intmain for k j ...
牛客演算法周周練2
題目鏈結 include define sc x scanf lld x define pf printf define rep i,s,e for int i s i e i define dep i,e,s for int i e i s i using namespace std typede...