https://www.acmicpc.net/problem/17490
시간 2초, 메모리 256MB
input :
output :
조건 :
문제의 예시를 볼 때 그룹이 어떻게 나뉘는 지를 확인 할 수 있다.
[1, 2, 3, 4, 5] 라는 건물이 존재할 떄.
2 3 / 4 5 / 5 1 의 건물 사이에서 공사가 진행 중이다.
이를 [1, 2 / 3, 4 / 5] 로 나눌 수 있다.
그리고 각 그룹에서 가장 작은 돌을 구해서 더한 값과 k를 비교하여 정답을 출력하도록 하자.
예외 처리를 할 부분이 몇 개 존재하는데.
리스트 슬라이싱을 사용하는 것이 편하므로 건물 중 작은 번호를 가진 것을 리스트에 저장하도록 하자.
그리고 이 위치들이 정렬 되어 있지 않기 때문에 에러가 발생 할 수 있으므로 정렬 하여야 한다.
그리디 알고리즘을 하듯 now 위치를 지정하고 pos의 원소를 하나 씩 꺼내 면서 각 그룹의 가장 적은 돌을 사용하는 경우를 찾도록 한다.
import sys
n, m, k = map(int, sys.stdin.readline().split())
data = list(map(int, sys.stdin.readline().split()))
pos = []
flag = 0
if m <= 1:
print("YES")
exit(0)
for i in range(m):
a, b = map(int, sys.stdin.readline().split())
if a == n and b == 1:
flag = 1
continue
if a > b:
a, b = b, a
pos.append(a)
pos.sort()
ans, now = 0, 0
first = min(data[now:pos[0]])
for item in pos:
temp = data[now: item]
ans += min(temp)
now = item
if flag == 0:
temp = data[now:]
last = min(temp)
if last < first:
ans -= first
ans += last
else:
ans += min(data[now:])
if ans > k:
print("NO")
else:
print("YES")