https://www.acmicpc.net/problem/13305
문제 요약
n개의 마을의 수를 입력받고 각 마을의 리터당 기름의 요금과 마을 사이 거리 ( n - 1 )를 입력 받습니다.
제일 왼쪽 도시에서 제일 오른쪽 도시로 이동하는 최소의 비용을 계산하는 프로그램을 작성해야합니다.
문제 풀이
1. 롱 롱 인티저 로 백터를 만들어서 마을 별 가격과 마을 사이 거리를 입력 받습니다.
2. t 는 가장 싼 가격의 마을의 인덱스 입니다.
3. t에 초기값으로 0을 넣고 마을 횟수 ( n ) 만큼 반복문을 돌립니다.
4. t번째 마을과 i번째 마을의 기름 가격을 비교하여 더 싼 가격을 t에 저장합니다.
5. 다음 마을까지 거리( r[i] 까지) 만큼 기름 가격을 sum에 더합니다.
6. 마지막 마을의 기름 가격은 의미 없으무로 예외 처리로 break합니다.
주의할 점
수를 담을 변수를 그냥 int로 선언시 더 큰 값의 경우의 수를 저장할 수 없기 때문에 롱롱으로 저장하는것을 잊지 말아야 합니다.
마지막 마을의 기름 요금은 어차피 넣을 필요가 없기 때문에 예외 처리도 잊지 말아야 합니다.
코드
#include <iostream>
#include <vector>
#include<algorithm>
using namespace std;
typedef long long ll;
ll n, t;
ll sum = 0;
vector<ll> r;
vector<ll> p;
ll a;
int main()
{
cin >> n;
for (int i = 0; i < n - 1; i++)
{
cin >> a;
rsum += a;
r.push_back(a);
}
for (int i = 0; i < n; i++)
{
cin >> a;
p.push_back(a);
}
// 비교할 값의 인덱스 초기값
//p[t] == 가장 싼 기름 가격
t = 0;
// 전체 마을 갯수 만큼 반복
for (int i = 0; i < n; i++)
{
// p[t]의 값과 현재 마을의 기름 값 비교
// 현재 마을이 더 싸면
if (p[t] > p[i])
{
// t 값 변경
t = i;
}
// 마지막 마을의 기름 가격은 의미 없음
if (i == n - 1)
{
break;
}
else
{
for (int j = 0; j < r[i]; j++)
{
// p[t]의 가격으로 다음 마을 까지 거리 만큼 가격을 더함
sum += p[t];
}
}
}
cout << sum;
return 0;
}
반응형
예제 입력 1
4
2 3 1
5 2 4 1
결과 1
예제 입력
4
3 3 4
1 1 1 1
결과 2
'BAEKJOON > Greedy' 카테고리의 다른 글
C++ / 10162 / 전자레인지 ( 그리디 알고리즘 ) (0) | 2024.10.29 |
---|---|
C++ / 1789 / 수 들의 합 ( 그리디 알고리즘 ) (0) | 2024.10.28 |
C++ / 2217 / 로프 ( 그리디 알고리즘 ) (0) | 2024.10.27 |
C++ / 1026 / 보물 ( 그리디 알고리즘 ) (0) | 2024.10.26 |
C++ / 1931 / 회의실 배정 ( 그리디 알고리즘 ) (0) | 2024.10.24 |