본문 바로가기

백준 문제 풀이

백준 13305번 주유소

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

 

13305번: 주유소

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

www.acmicpc.net

어떤 주유소의 가격이 가장 싸다면 그 주유소에서 목적지까지 갈 기름을 전부 사는것이 이득이다.

우선순위 큐를 이용하여 각 주유소의 비용이 적은 순으로 정렬하고 각 주유소부터 자신 이전에 찾은(더 비용이 적은) 주유소가 나올 때 까지 갈 수 있는 기름을 사도록 코드를 짰다.

 

 

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

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
    /*
    fist : 우선순위 큐에서 나ㅏ온 원소에 대해 자신보다 더 싼 주유소가 가장 처음 나오는 위치
    nowcost : 마지막에 비용을 계산할 때 현재 확인중인 도로를 지나가기 위한 기름을 살때 드는 리터당 가격
	*/
    int N, fisr = 100000, nowcost;
	long long int ans = 0;
    //거리가 최대 1000000000km, 도로는 999999999개, 리터당 가격도 최대 1000000000이니 long long int를 사용해야 한다
	cin >> N;
    //pair의 first는 비용 * -1, second는 도시 번호
	priority_queue<pair<int, int>> que;
    //calculating : 해당 지점에서 기름을 살지 말지를 저장하는 벡터
	vector<int> distandd(N - 1), cost(N), calculating(N);
	for (int i = 0; i < N - 1; i++){
		cin >> distandd[i];
	}
	for (int i = 0; i < N; i++){
		cin >> cost[i];
		que.push({ -cost[i], i });
	}

	while (!que.empty()){
		pair<int, int> a = que.top();
		que.pop();
		if (fisr < a.second) continue;
		fisr = a.second;
		calculating[a.second] = -a.first;
	}

	for (int i = 0; i < N; i++){
		if (calculating[i]) nowcost = calculating[i];
		if (i < N - 1) ans += (long long int) nowcost * distandd[i];
	}

	cout << ans;

	return 0;
}

'백준 문제 풀이' 카테고리의 다른 글

백준 1967번 트리의 지름  (0) 2021.03.16
백준 9613번 GCD 합  (0) 2021.03.16
백준 15483번 최소 편집  (0) 2021.03.16
백준 2197번 분해 반응  (0) 2021.03.16
백준 10277번 JuQueen  (0) 2021.03.16