Koder / 박성훈
article thumbnail

정올 문제라 한다.

생각을 살짝만 뒤집으면 아주 쉽게 풀수 있는 그리디 문제가 된다.

핵심은 "반드시 앞 도시에서 기름을 미리 쟁여둘 필요가 없다" 이다.

뒤의 모든 도시들을 보고 나중에 기름이 필요할거 같으니 사두는건 너무 복잡한 행위다.

그냥 뒤의 도시에 가보고

기름가격이 더 비싸면

지난 도시에서 기름을 사도 되는 것이다.

최첨단 이동장치가 있어서

기름이 배달이된다 생각하면 되려나 ㅋㅋㅋㅋ

 

아무튼 이렇게 문제를 보게 되면

문제는 단순히

가장 적은 기름값을 지니는 도시의 위치를 기억해뒀다가

그 위치의 기름을 계속 사들이기만 하면 되는

그리디 문제가 된다.

 

#include <stdio.h>

#define INF 1000000007

typedef long long int ll;

int road[123456] = {0};
int oil[123456]  = {0};

int min(int a, int b){return a>b?b:a;}

int main(){
	int oilvalue = INF;
	int n;
	ll ans = 0;
	
	scanf("%d", &n);
	for(int i=0; i<n-1; i++) scanf("%d", &road[i]);
	for(int i=0; i<n;   i++) scanf("%d", &oil[i]);
	
	for(int i=0; i<n-1; i++){
		oilvalue = min(oilvalue, oil[i]);
		ans += (ll)road[i] * (ll)oilvalue;
	}
	printf("%lld", ans);
	return 0;
}

oilvalue가 가장 싼 기름의 가격이다.

매 도시를 들릴때마다 기름을 갱신하고

그 앞에 지나야할 도로 분량의 기름을 산다.

 

깔끔하게 AC.

반응형