선분의 길이가 주어질때 볼록 다각형(conver polygon)이 될 조건
1. 문제
18044번: Polygon
You are given n segments of lengths ℓ1, ℓ2, . . . , ℓn, respectively. Determine the largest possible circumference of a convex polygon that can be constructed using these segments (in any order, and not neccessarily all of them). The polygon must be
www.acmicpc.net
2. 풀이
convex polygon은 앞으로 배울것 같지만...
지금은 모든 내각이 180도보다 작거나 같은 도형이라고 이해하면 될 것 같다
https://en.wikipedia.org/wiki/Convex_polygon
Convex polygon - Wikipedia
From Wikipedia, the free encyclopedia Polygon that is the boundary of a convex set An example of a convex polygon: a regular pentagon. In geometry, a convex polygon is a polygon that is the boundary of a convex set. This means that the line segment between
en.wikipedia.org
선분의 길이가 주어질때 최대 둘레를 가진 convex polygon을 만들도록 선분을 선택하라는게 문제인데.. 어떻게 해야할까?
삼각형 같은 경우 convex polygon일거고 여기서 아이디어를 얻어본다면
"가장 긴 변의 길이가 나머지 두변의 길이 합보다 작다"여야 삼각형인데
일반적인 n각형이 convex polygon일려면,
"가장 긴 변의 길이가 나머지 변의 길이 합보다 작다"여야 할 것 같다.
찾아봐도 어디 증명은 없는것 같고
직관적으로 다음 그림이 미쳤다
나머지 변들의 길이를 하나씩 붙여서 일직선으로 만들때, 가장 긴변의 길이보다 커야 위의 도형이 나오고
가장 긴변의 길이보다 작다면 아래 도형이 나오게 되는...
------------------------------------------------------------------------------------------------------------------------------------------
조건을 알긴 했지만 단순하게 문제에 접근하면 시간 초과 가능성이 높은게
테스트 케이스는 10만개인데 각 케이스마다 n의 수가 최대 10만개라 단순하게는 1초안에 모두 답하기 쉽지 않을 것 같다
결국 최대 둘레의 길이를 찾으면 되니까, 일단 모든 변의 길이를 전부 합한다
그리고 변의 길이를 오름차순 정렬
그러면 현재 순간 최댓값은 마지막 원소니까 n-1부터 0까지 순회를 한다
(모든 변의 길이 합) - (최대 변의 길이)와 (최대 변의 길이)를 비교
최대 변의 길이가 더 크다면, (모든 변의 길이 합) = (모든 변의 길이 합) - (최대 변의 길이)로 갱신하고, 다음으로 진행
하지만 최대 변의 길이가 더 작다면? 여기서 끝내면, 그게 둘레의 최댓값이 된다
또한 당연하지만 일각형 이각형 이런건 없잖아... n이 3보다 작으면 바로 0을 print
#convex polygon이 될 조건
#"가장 긴 변의 길이가 나머지 변의 길이 합보다 작다"
from sys import stdin
z = int(stdin.readline())
for _ in range(z):
n = int(stdin.readline())
lines = list(map(int,stdin.readline().split()))
if n < 3:
print(0)
else:
lines.sort()
remainder = sum(lines)
for i in range(n-1,-1,-1):
#최대 < (모든 변 길이합) - 최대이면 바로 break
#최대 >= (모든 변 길이 합) - 최대 이면, 현재 최대 변은 선택 불가능
if lines[i] >= remainder - lines[i]:
remainder -= lines[i]
else:
break
print(remainder)
'기하학' 카테고리의 다른 글
각도 구하는 math.atan, math.atan2 사용법 익히기 (0) | 2023.09.01 |
---|---|
다각형 내부의 격자점 수를 셀 수 있을까 - 픽의 정리(pick's theorem) + (선분에 있는 격자점의 개수 세는 방법) (0) | 2023.08.31 |
정육면체가 쌓인 3차원 도형의 겉넓이를 구하는 방법 (0) | 2023.08.25 |
모든 좌표까지 맨해튼 거리 합이 최소가 되는 위치를 구하는 방법 (0) | 2023.08.24 |
모든 좌표 쌍의 맨해튼 거리의 합을 효율적으로 구하는 방법 (0) | 2023.08.24 |