給定 N 個點(城堡頂點),求包含所有點且距離每個點至少 L 的最短圍牆長度。等價於:求點集凸包周長,再加上半徑為 L 的圓周長(2πL)。結果四捨五入到英尺(精度 8 英寸 = 2/3 英尺)。
(b-a) × (c-a) > 0 表示 a→b→c 左轉。2 * PI * L。struct Point { double x, y; };
double cross(Point a, Point b, Point c) { // (b-a) x (c-a)
return (b.x-a.x)*(c.y-a.y) - (b.y-a.y)*(c.x-a.x);
}
double dist(Point a, Point b) { return hypot(a.x-b.x, a.y-b.y); }
int graham(Point p[], int n, Point ch[]) {
if (n < 3) return -1;
// 1. find p0
for (int i=1;i EPS) return cr > 0;
return dist2(p0, a) < dist2(p0, b);
});
// 3. scan
int top = 2;
ch[0] = p[0]; ch[1] = p[1];
for (int i=2;i1 && cross(ch[top-2], ch[top-1], p[i]) <= EPS) --top;
ch[top++] = p[i];
}
return top;
}
結果用 printf("%.0f\n", ans) 四捨五入到整數英尺。多測試用例之間需輸出空行。
Wall 題是凸包周長的直接應用。格雷厄姆掃描 O(N log N) 是標準解法,關鍵在於極角排序與叉積判斷轉向的正確處理。理解凸包的幾何意義與代碼模板,是計算幾何入門的必修課。