https://www.acmicpc.net/problem/13305
13305번: 주유소
표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 도시의 개수를 나타내는 정수 N(2 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 인접한 두 도시를 연결하는 도로의 길이가 제일 왼쪽 도로부터 N-1
www.acmicpc.net
문제 해결 과정
착안
아래와 같이 탐욕(greedy) 알고리즘에 기반하여 문제를 해결할 수 있다.
- 현재 위치해 있는 도시의 주유 비용을 기준으로 삼는다.
- 순차적으로 우측 도시를 탐색하며 현재 도시의 주유 비용보다 주유 비용이 더 저렴한 도시를 탐색한다.
- 탐색에 성공하면, 현재 도시에서 주유하여 해당 도시까지 한 번에 이동한다.
- 탐색에 실패하면, 현재 도시에서 마지막 도시까지 한 번에 이동한다.
- 위의 과정을 가장 우측 도시에 도착할 때까지 반복한다.
구현
[스포 주의] 아래 '더보기'를 누르면 코드가 나오니 주의하세요~
더보기
#include <iostream>
using namespace std;
int N;
int Cities[100000];
int Edges[99999];
size_t Cost;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> N;
for (int i = 0; i < N - 1; i++)
cin >> Edges[i];
for (int i = 0; i < N; i++)
cin >> Cities[i];
int i = 0;
while (i < N - 1)
{
int oilCost = Cities[i];
int distSum = 0;
while (oilCost <= Cities[i])
{
if (i == N - 1)
break;
distSum += Edges[i++];
}
Cost += (size_t)distSum * (size_t)oilCost;
}
cout << Cost << "\n";
return 0;
}
실행 결과
'C++ 코딩 문제 풀이 > 백준' 카테고리의 다른 글
[Baekjoon] 12865번: 평범한 배낭 (0) | 2023.08.01 |
---|---|
[Baekjoon] 1629번: 곱셈 (0) | 2023.07.31 |
[Baekjoon] 16234번: 인구 이동 (0) | 2023.07.26 |
[Baekjoon] 11404번: 플로이드 (0) | 2023.07.25 |
[Baekjoon] 2293번: 동전 1 (0) | 2023.07.24 |
댓글