본문 바로가기
알고리즘/그리디

백준 13305번 : 주유소

by Jason95 2021. 1. 6.

그리디 개념 : 미래를 생각하지 않고 각 단계에서 최선의 선택을 했을 때 전체적으로도 최선이 되는 경우에 사용

 

문제 링크 : www.acmicpc.net/problem/13305

내 풀이(2021.1.6.) :

#include <iostream>

using namespace std;

long long dist[100000 - 1];
long long cost[100000];

int min_index;
long long min_cost = 1000000000;

long long total_cost = 0;
long long remaining_dist = 0;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N; cin >> N;
	for (int i = 0; i < N - 1; i++) {
		cin >> dist[i];
		remaining_dist += dist[i];
	}

	for (int i = 0; i < N; i++) {
		cin >> cost[i];
	}

	for (int i = N - 2; i >= 0; i--) {
		if (min_cost > cost[i]) {
			min_cost = cost[i];
			min_index = i;
		}
	}

	for (int i = 0; i < min_index; i++) {
		total_cost += cost[i] * dist[i];
		remaining_dist -= dist[i];
	}

	total_cost += cost[min_index] * remaining_dist;

	cout << total_cost;
	
	return 0;
}

결과 : 틀렸습니다

반례 : www.acmicpc.net/board/view/60029

5
3 2 1 4
5 8 9 4 1

output : 56
answer : 46

 

알고리즘 자체를 잘못 짰다.

 

내 풀이2(2021.1.6.) :

#include <iostream>

using namespace std;

long long dist[100000 - 1];
long long cost[100000];
long long min_cost = 1000000000;
long long total_cost = 0;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N; cin >> N;
	
	for (int i = 0; i < N - 1; i++) {
		cin >> dist[i];
	}

	for (int i = 0; i < N - 1; i++) {
		cin >> cost[i];
		if (min_cost > cost[i]) min_cost = cost[i];
		total_cost += min_cost * dist[i];
	}

	cout << total_cost;

	return 0;
}

결과 : 성공

'알고리즘 > 그리디' 카테고리의 다른 글

백준 1541번 : 잃어버린 괄호  (0) 2021.01.10
백준 1931번 : 회의실 배정  (0) 2021.01.09
백준 11047번 : 동전 0  (0) 2021.01.08