Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

dh-winternagi 님의 블로그

(11399) ATM 본문

백준 (C++)/Solve

(11399) ATM

dh-winternagi 2026. 4. 18. 09:59

https://www.acmicpc.net/problem/11399

단계별로 풀어보기

23단계(그리디 알고리즘) 3번째

 

 

 

어떤 두 사람 i, j가 이웃해서 줄을 서 있다고 하자.

이 두 사람이 줄을 서는 순서가 i→j이든 j→j이든 앞사람의 소요 시간에는 영향을 주지 않고, Pi+Pj=Pj+Pi이므로 뒷사람의 소요 시간에도 영향을 주지 않는다.

이때 앞사람까지의 대기 시간을 x라 하면 각 경우에 두 사람의 소요 시간은 다음과 같다.

1) i→j일 때 i의 소요 시간은 x+Pi, j의 소요 시간은 x+Pi+Pj

2) j→i일 때 j의 소요 시간은 x+Pj, j의 소요 시간은 x+Pj+Pi

같은 값은 비교의 의미가 없으니 제외하면 첫번째 경우는 Pi의 소요 시간이 걸리고 두번째 경우는 Pj의 소요 시간이 걸린다.

따라서 P값이 더 작은 사람이 앞에 서는 것이 이득이다.

이를 모든 사람에게 적용하면, P를 오름차순으로 정렬한 대로 줄을 서는 것이 전체 소요 시간을 최소화하는 최적해임을 알 수 있다.

이를 그리디 알고리즘의 Exchange argument 기법이라고 한다. (실제로 증명 과정은 더 복잡하지만, 대충 이런 개념이구나 정도만 이해하고 넘어가면 된다.)

 

 

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() 
{
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  
  int n;
  
  cin >> n;
  
  vector<int> v(n+1);
  
  for(int i=1;i<=n;i++)  cin >> v[i];
  
  sort(v.begin(), v.end());
  
  int ans= 0;
  
  for(int i=1;i<=n;i++){
    v[i]+= v[i-1];
    ans+= v[i];
  }
  
  cout << ans;
  
  return 0;
}

'백준 (C++) > Solve' 카테고리의 다른 글

(13305) 주유소  (0) 2026.04.18
(1541) 잃어버린 괄호  (0) 2026.04.18
(1931) 회의실 배정  (0) 2026.04.18
(11047) 동전 0  (0) 2026.04.18
(25682) 체스판 다시 칠하기 2  (0) 2026.04.18