題目大意:有n個平行與x軸的線段,每條線段代表乙個靶子。你的任務是判斷是否可以站在x軸上[0,w]區間的某個位置射箭,使得箭能穿過所有靶子。
解題思路:
1、二分人站的位置,對於每個位置,維護靶子的可以擊中的角度,[l, r]是現在箭可以到達的角度區間,[l, r] 是後面靶子的角度區間。
2、有乙個函式是atan2(y, x)所表達的意思是座標原點(0, 0)為起點,指向(x,y)的射線在座標平面上與x軸正方向之間的角的角度。atan2(y,x - x') 表示的也就是說以 (x', 0)為起點。至於為什麼左區間的起點是arr[i].r - x 為什麼是靶子的右端點減去人的x呢,是因為右端點和原點組成的直線與x軸的夾角小,所以應該被當做左區間端點l。夾角大的當做右端點r。
3、最後二分,當l > r 時, 人需要右移。 r < l 時人左移。
二分箭術 G K穩健過神思路
自從資料片開始,一直在思考穩定可靠的過神思路,現在有眉目了,試驗了幾把感覺不錯,先分享如下 1 只開2個分城,特殊情況除外。re 經過多次打的經驗,開2個分城比開3個分城更容易選址,政策更快,快樂問題容易解決,安全性好。而貢獻的科研不輸於3個分城,這是因為3分開最慢,而且會拖累快樂和國立,實際科研算...
LA 4253 箭術(二分列舉)
題意 有n個平行於x軸的線段,每條線段代表乙個靶子。判斷是否可以站在x軸上 0,w 區間內的某個位置射箭。思路 二分列舉座標點,這道題需要用到atan2函式,它返回乙個角度值,對於每個靶子,利用atan2函式確定能射中靶子的區間,如果靶子之間區間沒有重合部分,說明該座標點不能射中所有靶子。在下面的 ...
uva 714 貪心 二分
include using namespace std const int maxm 500 int k,m,p maxm bool solve int ans else pre p i return kr k void print int ans else pre p i for int i 0 ...