[BOJ] 금과 은 운반하기
Date:
[BOJ] 금과 은 운반하기
Problem URL : 금과 은 운반하기
#include <string>
#include <vector>
using namespace std;
long long solution(int a, int b, vector<int> g, vector<int> s, vector<int> w, vector<int> t) {
long long answer;
long long start = 0;
long long end = 10e14;
int size = t.size();
while (start <= end) {
long long mid = (start + end) / 2;
long long gold = 0;
long long silver = 0;
long long total = 0;
for (int i = 0; i < size; i++) {
long long move = mid / (t[i] * 2);
if (mid % (t[i] * 2) >= t[i]) move++; // 마지막 편도는 돌아오지 않아도 된다.
gold += (g[i] < move * w[i]) ? g[i] : move * w[i];
silver += (s[i] < move * w[i]) ? s[i] : move * w[i];
total += (g[i] + s[i] < move * w[i]) ? g[i] + s[i] : move * w[i];
}
if (gold >= a && silver >= b && total >= a + b) {
end = mid - 1;
answer = mid; // 조건을 만족했을 때 정답 후보 [1]
} else {
start = mid + 1;
}
}
return answer;
}
Comments
gold >= a && sil >= b && total >= a + b
이 조건을 생각해내는 것이 중요하다.
그리고 [1]의 answer = mid; 의 경우, 항상 더 작은 값을 탐색하게 된다. ( min을 해줄 필요가 없다.)
댓글