[c++] 백준 13305: 주유소

728x90

[c++] 백준 13305: 주유소

🥈실버 3

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

 

13305번: 주유소

표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 도시의 개수를 나타내는 정수 N(2 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 인접한 두 도시를 연결하는 도로의 길이가 제일 왼쪽 도로부터 N-1

www.acmicpc.net


접근

원 안의 숫자가 리터 당 기름의 가격, 막대 위의 숫자가 다음 도시까지의 거리일 때, 맨 오른쪽 도시까지 가기 위한 최소 비용을 출력하는 문제.

 

5원짜리 도시에서는 다음 도시까지 필요한 거리만큼만 기름을 사는 것이 합리적이다. 다음 도시에서는 리터 당 기름의 가격이 2원밖에 하지 않기 때문이다. > 5 * 2 = 10

 

만약 2원짜리 도시에서 다음 도시까지 필요한 거리 3만큼의 기름을 사면 2 * 3 = 6,

4원짜리 도시에서 다음 도시까지 필요한 거리 1만큼의 기름을 사면 4 * 1 = 4,

따라서 합은 10이된다.

 

그러나 2원짜리 도시에서는 다음 도시까지 필요한 거리보다 더 많은 기름을 사는 것이 합리적이다. 

왜냐하면 그 다음 도시는 리터당 4원을 주고 구매해야하기 때문에 차라리 2원짜리 도시에서 더 많은 기름을 구매해서 출발하는게 비용을 줄일 수 있기 때문이다.

 

현재 도시의 가격과 다음 도시의 가격을 비교했을 때 더 저렴한 도시의 가격을 minPrice라고 한다면, 매 턴마다 (minPrice * 다음 도로의 거리)를 전체 비용에 더해주도록 하면 된다.

 

문제에 다음과 같은 조건이 주어져 있다.

표준 입력으로 다음 정보가 주어진다.
첫 번째 줄에는 도시의 개수를 나타내는 정수 N(2 ≤ N ≤ 100,000)이 주어진다.
다음 줄에는 인접한 두 도시를 연결하는 도로의 길이가 제일 왼쪽 도로부터 N-1개의 자연수로 주어진다.
다음 줄에는 주유소의 리터당 가격이 제일 왼쪽 도시부터 순서대로 N개의 자연수로 주어진다.
제일 왼쪽 도시부터 제일 오른쪽 도시까지의 거리는 1이상 1,000,000,000 이하의 자연수이다. 리터당 가격은 1 이상 1,000,000,000 이하의 자연수이다. 

도시마다의 기름 값은 N개의 배열로 잡고 도로의 길이는 N-1개의 배열로 잡아야 한다.

그리고 각 도시의 기름값에 대한 배열과 도로의 길이에 대한 배열, 정답으로 출력할 값은 long long으로 선언해야 한다.

출력될 값은 minPrice * 다음 도로의 길이의 합으로 되어있기 때문이다.

 

   

여기 조건에서 리터 당 가격은 최대 10000이라고 해서 처음 최소값을 10001로 잡고 진행했는데 자꾸 틀렸다고 나온다.

그냥 입력받은 각 도시의 가격 배열의 첫번째 값으로 설정하니까 정답으로 처리가 되었다...

 

코드

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  ll cityNum;	// 입력받을 도시의 수
  cin >> cityNum;
  ll loadLength[cityNum-1];	// 입력받을 도로들의 값
  ll cityPrice[cityNum];	// 입력받을 도시마다의 기름 값
  for (ll i = 0; i < cityNum-1; i++) {
    cin >> loadLength[i];
  }
  
  for (ll i = 0; i < cityNum; i++) {
    cin >> cityPrice[i];
  }
  ll minPrice = cityPrice[0];	// 10001같은 걸로 하니까 틀렸다고 나와서 그냥 첫번째 값으로 했다.

  ll ans = 0;
  for (ll i = 0; i < cityNum-1; i++) {
    minPrice = min(minPrice, cityPrice[i]);	// 기존 값과 다음 도시 중 더 싼 값을 기준으로 한다.
    ans += minPrice * loadLength[i];	// 이렇게 할 경우 도로에 대해서는 다음 인덱스로 이동하는 반면, 더 싼 값의 도시에 대해서 계산을 진행할 수 있다.
  }
  cout << ans;

  return 0;
}
728x90

'알고리즘 문제 풀이' 카테고리의 다른 글

[c++] 백준 20365: 블로그2  (0) 2023.04.11
[c++] 백준 20300: 서강근육맨  (0) 2023.04.10
[c++] 백준 11399: ATM  (0) 2023.04.09
[c++] 백준 1758: 알바생 강호  (0) 2023.04.08
[c++] 백준 2217: 로프  (0) 2023.04.08