N개의 도시가 있고, 각 도시엔 하나의 주유소만 있을 때, 가장 왼쪽 도시에서 오른쪽 도시로 갈 때 사용하는 최소의 금액을 찾으면 된다.
예시
위와 같이 4개의 도시가 있고, 각 도시의 주유소 가격은 1L당 5원, 2원, 4원, 1원이다.
각 도시 사이의 거리는 2km, 3km, 1km일 때 최소한의 가격은?
- 1번 도시에서 다 주유하고 갈 때 : 5 x ( 2 + 3 + 1 ) = 30원
- 1번 도시에서 2만큼, 2번 도시에서 3만큼, 3번 도시에서 1만큼 주유할 때
: 5 x 2 + 2 x 3 + 4 x 1 = 20원- 그리디 알고리즘 적용 : 1번 도시에서 2만큼, 2번 도시에서 모두 주유하고 갈 때
: 5 x 2 + 2 x ( 3 + 1 ) = 18원
입력 : 도시의 개수를 나타내는 정수 N(2 ≤ N ≤ 100,000), 인접한 두 도시를 연결하는 도로의 길이(모든 합은 1 ≤ N ≤ 1,000,000,000), 각 주유소의 리터당 가격(1 ≤ N ≤ 1,000,000,000)
출력 : 제일 왼쪽 도시에서 제일 오른쪽 도시로 가는 최소 비용
long long
으로 정의해야한다! (1 ≤ N ≤ 1,000,000,000)int
로 했다가 48점을 맞았다 ................ :(너무 쉽게 해결해서 이게 맞나.. 했는데 맞는 것 같다! :)
if
에 해당되지 않아도 total += cost[k] * distance[k]
인 것을 볼 수 있다!#include <iostream>
#include <algorithm>
using namespace std;
#define endl "\n"
int main(){
cin.tie(0); cout.tie(0);
int N; // 도시의 개수
cin >> N;
long long* distance = new long long[N - 1]; // 도시 간의 거리
for (int i = 0; i < N - 1; i++) {
cin >> distance[i];
}
long long* cost = new long long[N]; // 1리터당 가격
for (int j = 0; j < N; j++) {
cin >> cost[j];
}
long long total = 0;
for (int k = 0; k < N-1; k++) {
if (cost[k] < cost[k+1]) {
cost[k+1] = cost[k];
}
total += cost[k] * distance[k];
}
cout << total;
return 0;
}