˙www.acmicpc.net/problem/13305
13305번: 주유소
표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 도시의 개수를 나타내는 정수 N(2 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 인접한 두 도시를 연결하는 도로의 길이가 제일 왼쪽 도로부터 N-1
www.acmicpc.net
그리디하게 접근하면 쉽게 풀리는 문제다.
내 접근법은 이렇다.
1. 현재 지역이 다음 지역보다 가격이 비싸다면 그 다음 지역을 검색해서 현재 지역보다 싼 지역을 찾음
2. 현재 지역보다 싼 지역을 찾았다면 그 지역까지의 거리값만큼 충전 후 이동
3. 이후 반복
단, 첫 번째 지역에서 반드시 충전해야 한다.
#include <iostream>
using namespace std;
using ll = long long;
ll ar[100001], dist[100000];
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
ll n, ans = 0;
cin >> n;
for (int i = 0; i < n - 1; i++) cin >> dist[i];
for (int i = 0; i < n; i++) cin >> ar[i];
int i = 0, j = 1;
while (1) {
if (i == n) break;
while (ar[i] < ar[j]) j++;
if (j - i > 1) { //거리의 차가 1이 넘는다면
ll sum = 0;
for (int v = i; v < j; v++) {
sum += dist[v]; //이동해온 거리의 합을 더해주고
}
ans += ar[i] * sum; //현재 가격*거리의 합
}
else {
ans += ar[i] * dist[i];
}
i = j++;
}
cout << ans << endl;
return 0;
}
계산의 합이 int 형 범위를 초과하는것을 조심해야 한다.
'BOJ' 카테고리의 다른 글
백준 2331 반복수열 (0) | 2020.09.08 |
---|---|
백준 10451 순열 사이클 (0) | 2020.09.07 |
백준 2981 검문 (0) | 2020.09.07 |
백준 12865 평범한 배낭 (0) | 2020.09.07 |
백준 19621, 19622 회의실배정 2, 3 (0) | 2020.09.06 |