結果
| 問題 |
No.180 美しいWhitespace (2)
|
| ユーザー |
|
| 提出日時 | 2015-05-19 19:23:12 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,154 bytes |
| コンパイル時間 | 72 ms |
| コンパイル使用メモリ | 12,672 KB |
| 実行使用メモリ | 11,136 KB |
| 最終ジャッジ日時 | 2024-07-06 05:44:06 |
| 合計ジャッジ時間 | 1,887 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 26 WA * 5 |
ソースコード
def convex_hull(points):
'''二次元平面上の点のリスト points の凸包を返す。Andrew のアルゴリズムを使用。
引数:
points = [(x0, y0), (x1, y1),...] 点のリスト
同じ点は含まない(全て異なる点である)とする。
返り値:
convex_hull = [(xi, yi), (xj, yj),...] 点のリスト。時計回りに並んでいる。
'''
points.sort()
upper_bounds = get_bounds(points)
points.reverse()
lower_bounds = get_bounds(points)
del upper_bounds[-1]
del lower_bounds[-1]
upper_bounds.extend(lower_bounds)
return upper_bounds
def get_bounds(points):
bounds = [points[0], points[1]]
for xi, yi in points[2:]:
while len(bounds) > 1 and not is_convex(bounds, xi, yi):
del bounds[-1]
bounds.append((xi, yi))
return bounds
def is_convex(bounds, x2, y2):
x1, y1 = bounds[-1]
x0, y0 = bounds[-2]
return (x1 - x0) * (y2 - y1) < (y1 - y0) * (x2 - x1)
def read_data():
N = int(input())
AB = [tuple(map(int, input().split())) for i in range(N)]
return N, AB
def solve(N, AB):
# 重複する点を除く
AB = list(set(AB))
if len(AB) == 1:
return 1
# 凸包を作り、1周走査して、辺の傾き(の逆数に-1を乗じた値を整数化したもの)の一覧を取得する。
ps = convex_hull(AB)
slopes = get_slopes(ps)
# tab の候補を1つづつ試していく
min_cost = float('inf')
best_tab = 1
for tab in slopes:
xy = [x + tab * y for x, y in ps]
cost = max(xy) - min(xy)
if cost < min_cost:
min_cost = cost
best_tab = tab
return best_tab
def get_slopes(ps):
slopes = set([1])
prev_x, prev_y = ps[-1]
for x, y in ps:
dx = x - prev_x
dy = y - prev_y
if dy == 0:
continue
slope = int(- dx / dy)
if slope > 0:
slopes.add(slope)
slopes.add(slope + 1)
prev_x, prev_y = x, y
return slopes
if __name__ == '__main__':
N, AB = read_data()
print(solve(N, AB))