部落格觀賞效果更佳
平面直角座標系上有m
(<
=800
)m(<=800)
m(<=8
00)個點,每個點的x
xx座標都在[1,
n]
[1,n]
[1,n
]之內,n
<
=1000
n<=1000
n<=1
000,y
yy座標<=1
e5
<=1e5
<=1
e5。每個點珂以設乙個半徑為r
rr的攻擊塔(攻擊範圍包含邊界)。x
xx軸上[1,
n]
[1,n]
[1,n
]的區域是敵人的進攻線,請你在每個位置都設定一些防禦塔,使得敵人無法在y
yy座標上無限增大(敵人珂以各種繞路),並且r
rr的最大值最小。
抽象成圖。邊權為兩個點之間的距離/2。設定起點s,s到乙個點的距離為這個點的x
xx座標。設定終點t,t到乙個點的距離為n-這個點的x
xx座標。從s到t跑最短路,路徑的長度定義為路徑上所有邊權的最大值。
如果我們的最大半徑為r
rr,那麼肯定每個點都要設定半徑r
rr。反正半徑又不花錢,那肯定往大里放啊。
然後對於乙個點u,v
u,vu,
v,設距離為d
dd。那麼,兩邊都設定半徑為d/2
d/2d/
2就能覆蓋u,v
u,vu,
v之間的部分了。
當然,我們的目的是封鎖y
yy軸。稍微轉化一下,就是要從左到右完美的封鎖出「一條」來。「一條」珂以是曲線,看起來還很粗,只要不空出來即珂。因為敵人走位隨便走,你只要一點空出來,敵人鑽過去,就珂以無限向y
yy軸延伸了。
所以,我們還要建立兩個點,表示左邊界和右邊界。就是上面說的s和t。要說幾何意義,就是s:直線x=0,t:直線x=n。然後s到乙個點顯然需要半徑為這個點的x座標值,才能封鎖這個點到s的範圍。t同理。
然後,對於我們從s到t,也就是從左到右,選擇的一條鏈上,乙個空位也不能有,也就是每個空都要完美的守住。所以這條鏈的長度就是最長邊的值。
這樣跑一遍最短路即珂。記得邊權是實數,而不是整數。
#include
using
namespace std;
namespace flandre_scarlet
ed[n*n<<1]
;void
clear
(int _v=n,
int _e=n<<1)
void
addedge
(int u,
int v,real w=
0.0)
; head[u]
=edgecount;
}void
add2
(int u,
int v,real w=1)
intstart
(int u)
intto
(int u)
real label
(int u)
intnext
(int u)
}g;voidr1(
int&x)
int n,m;
real x[n]
,y[n]
;void
input()
real d
(int dx,
int dy)
//求距離
struct node
;bool
operator
<
(node a,node b)
bool vis[n]
;real dis[n]
; priority_queue q;
void
dijkstra
(int s)
);dis[s]
=0.00
;while
(!q.
empty()
));}
}}}//dijkstra演算法(堆優化)
void
soviet()
//s和t的邊
f(i,
1,m)
f(j,
1,i-1)
//兩點之間的邊,邊權為距離/2
dijkstra
(s);
printf
("%.2f\n"
,dis[t]);
}#define flan void
flan ismywife()
}int
main()
題解 洛谷 1783 海灘防禦
題目描述 wlp同學最近迷上了一款網路聯機對戰遊戲 終於知道為毛johnkram每天刷洛谷效率那麼低了 但是他卻為了這個遊戲很苦惱,因為他在海邊的造船廠和倉庫總是被敵方派人偷襲。於是,wlp動用了他那豐滿且充實的大腦 或許更偏向前者 想出了乙個好主意,他把海灘分成垂直於海岸線的若干列,在其中的幾列上...
洛谷 P1783 海灘防禦
題目描述 wlp同學最近迷上了一款網路聯機對戰遊戲 終於知道為毛johnkram每天刷洛谷效率那麼低了 但是他卻為了這個遊戲很苦惱,因為他在海邊的造船廠和倉庫總是被敵方派人偷襲。於是,wlp動用了他那豐滿且充實的大腦 或許更偏向前者 想出了乙個好主意,他把海灘分成垂直於海岸線的若干列,在其中的幾列上...
P1783 海灘防禦 最短路
題意 題目的意思就是要建立一道防線,從x 0,鏈結到x n 題目會給出m個哨點,每個哨點可以包含半徑為k的範圍,通過這些哨點來建立防線 如圖,建立類似這樣的一條防線,那麼我們就是要從左邊建到右邊,找一條最短路 思路 假如我們單獨處理題目中給出的哨點的話,那麼兩岸還沒處理到,所以我們增加m 1 設立在...