題意,給出一塊方框的左上、右下角座標,然後輸入n個擋板的兩端點座標(擋板從0~(n-1)標記),再輸入m個玩具丟到框內的座標。資料保證玩具丟到框裡,且擋板已經從左到右排好序。輸出落在每塊擋板前空間內的玩具個數。
類似的方法以前在杭電oj遇到過,是一道計算多邊形面積題目。當時沒有學向量積運算,所以最後只是記了個多邊形面積公式。poj 2318這道題,也是叉積運算,恰好今天微積分講了向量積基礎內容,晚上集訓隊又繼續深入了向量積的一些應用,於是這道題可以獨立a掉了。
由於輸入的資料各種被保證,最終只需要依次計算兩點是否在擋板同側,邊界處理、排序什麼的全部免掉,當初擔心的o(n^2)超時問題,也因為這題資料夠水沒有發生。當然,較好的辦法還是二分查詢。
叉乘的另外一些應用,正結合題目學習中,之後繼續更新。
附上沒有二分優化的叉積運算(資料水得可以,590ms過的)
1 #include2 #include
3using
namespace std;45
const
double eps = 1e-8;67
struct point;
1011
struct vector;
1415
double xmulti(const point p1, const point p2, const point p0)
16 19
20bool same_side(const point p1, const point p2, const vector vec)
21 24
25int main()
26 ;
32 point p1, p2, p_toy, p_center;
33 vector *v_node = new vector[n];
34 scanf("
%lf%lf%lf%lf
", &p1.x, &p1.y, &p2.x, &p2.y);
35 p_center.x = p1.x;
36 p_center.y = (p1.y + p2.y) / 2;
37for(int i = 0; i < n; i++)
38
43while(m--)
44
54 }
55if(!find)
56
59 }
60if(!first)
61
64 first = 0;
65for(int i = 0; i <= n; i++)
66
69 delete v_node;
70 v_node = null;
71 }
72return
0;73 }
叉積的性質 poj2318 TOYS
題目大意 給定乙個矩形,中間有n塊板把這個矩形分成n 1塊,從0開始編號。保證按照順序給出並且沒有相交。給定m個點,詢問每乙個塊內有多少個點。題目分析 對於每乙個點二分所有的線段,然後利用叉積的性質判斷它在這條線的左邊還是右邊,統計答案。時間複雜度o mlogn 水題一枚 我這種蒟蒻也就能做這種題了...
POJ 2318 TOYS(叉積 二分)
click here 題意 有乙個矩形的盒子,中間插了n個擋板,將盒子分成n 1個區域,然後給m個點,問最後每個區域落下多少個點。點不會落到擋板上 解題思路 把矩形的右邊看成第n 1個擋板。稍加分析,得到這個特點 若點 k 在擋板 i 的左邊,那麼 k 也一定在擋板 j 的左邊 i j n 1 則對...
poj 2318 TOYS 叉積的簡單應用
第一道計算幾何題。題意 在乙個長方形盒子中被線段劃分成了幾段區域,然後每段區域中都有一些物品,讓你判斷在每個區域中分別有幾個物品。叉積的簡單應用 這就要用到向量叉積。叉積的乙個非常重要的性質是通過它的符號判斷兩向量相互之間的順逆時針關係 設向量p x1,y1 q x2,y2 如果p q 0則p在q的...