빚 청산

시간 제한1초메모리 제한128 MB

요약
1번부터 N번 위치에 선 친구들이 각각 빚이나 채권을 가지고 있고, 베시는 0에서 빈손으로 출발해 현금이 음수가 되지 않게 하면서 N에서 끝나야 한다. 모든 채권과 채무를 정산하는 최소 이동 거리를 구한다.
난이도

어려움10점 중 8점

유형
그리디, 배열, 누적 합
정답자
아직 제출이 없습니다

문제

Bessie는 NN(1≤N≤1000001 \le N \le 100000)명의 친구 각각과 돈을 빌리거나 빌려주었습니다. 친구에게는 11부터 NN까지 번호가 매겨져 있습니다.

드디어 빚을 갚는 날이 되었습니다. Bessie가 받을 돈의 합이 갚아야 할 돈의 합보다 많습니다. 친구들은 일직선으로 서 있으며, ii번 친구는 헛간에서 ii미터 떨어진 곳에 서 있습니다. Bessie는 헛간(위치 00)에서 출발해 줄을 따라 걸으며, 자신에게 빚진 친구에게서 돈을 받고, 자신이 빚진 친구에게 돈을 갚습니다.

각 친구 ii에는 정수 DiD_i(−1000≤Di≤1000-1000 \le D_i \le 1000, Di≠0D_i \ne 0)가 주어집니다. Di>0D_i > 0이면 ii번 친구가 Bessie에게 DiD_i만큼 빚진 것이고, Di<0D_i < 0이면 Bessie가 ii번 친구에게 ∣Di∣|D_i|만큼 빚진 것입니다.

Bessie는 자신에게 빚진 친구를 지날 때 그 돈을 즉시 받을 수 있습니다. 하지만 자신이 빚진 친구에게는 현재 들고 있는 현금이 갚을 금액 이상일 때에만 갚을 수 있습니다(들고 있는 현금은 결코 음수가 될 수 없습니다). 어떤 친구에게 처음 도착했을 때 갚을 현금이 부족할 수 있으므로, 그 친구를 지나쳐 더 앞에서 돈을 받은 뒤 다시 돌아와 갚아야 할 수도 있습니다.

Bessie는 헛간(위치 00)에서 출발하여 줄의 맨 끝(위치 NN)에서 여정을 마쳐야 합니다. 모든 거래를 끝내기 위해 이동해야 하는 최소 총 거리는 얼마입니까?

입력

  • 첫째 줄: 정수 NN.
  • 둘째 줄부터 N+1N+1번째 줄까지: i+1i+1번째 줄에는 정수 DiD_i가 주어집니다.

출력

  • 첫째 줄: Bessie가 모든 친구에게서 돈을 받고 갚기 위해 이동해야 하는 최소 총 거리를 나타내는 정수 하나.

힌트

예시에서 다섯 친구는 위치 11부터 55까지 서 있고, 각각의 값은 100,−200,250,−200,200100, -200, 250, -200, 200입니다.

  • 헛간에서 오른쪽으로 걸어 11번 친구에게서 100100을 받습니다(현재 100100).
  • 22번 친구에게는 200200을 갚아야 하지만 현재 100100뿐이므로 지나칩니다. 33번 친구까지 가서 250250을 받습니다(현재 350350).
  • 다시 22번 친구에게 돌아와 200200을 갚습니다(현재 150150).
  • 다시 오른쪽으로 걸어 44번 친구(200200을 갚아야 하지만 현재 150150뿐)를 지나치고 55번 친구에게서 200200을 받습니다(현재 350350).
  • 44번 친구에게 돌아와 200200을 갚고(현재 150150), 줄의 맨 끝으로 돌아와 여정을 마칩니다.

이동 거리는 3+1+3+1+1=93 + 1 + 3 + 1 + 1 = 9입니다.

예제3

  1. 예제 1

    입력
    5
    100
    -200
    250
    -200
    200
    
    예상 출력
    9
    
  2. 예제 2

    입력
    1
    5
    
    예상 출력
    1
    
  3. 예제 3

    입력
    2
    -500
    1000
    
    예상 출력
    4