이번문제는 어렵지 않다.
핵심은 이거다. 일단 제일 먼집부터 방문하는것이다.
왜? 먼집부터 방문해야하냐?
그래야, 만약 먼집에 서 처리를 할 수 있으면 방문을 안해도 되기 때문이다.
그래서 그냥 구현은 문제에서 준 예시처럼 구현하면 된다.
처음에 약간 헷갈린게,
1 ≤ cap ≤ 50
0 ≤ deliveries의 원소 ≤ 50
라고 적혀있어서 무조건 첫번째집은 방문만 하면 그 집에서 배달을 못할 경우는 없다라고 생각했는데, 그건 아니고
cap 2, deliveries4인경우가 있다.
그래서
2,2, [0,0][0,4] 인경우에는
2번째집을 2번방문해야하므로 flag를 세워서 다시 검사해줬다.
#include <string>
#include <vector>
#include <iostream>
using namespace std;
long long solution(int cap, int n, vector<int> deliveries, vector<int> pickups) {
long long answer = -1;
for (int i = n-1; i >= 0; --i) {
int flag = 0;
if (deliveries[i] > 0 || pickups[i] > 0) {
flag = i;
//give box
int checkbox = 0;
for (int j = i; j >= 0; j--) {
if ((checkbox + deliveries[j]) <= cap) {
checkbox += deliveries[j];
deliveries[j] = 0;
}
else {
int tmp = cap - checkbox;
checkbox = cap;
deliveries[j] -= tmp;
break;
}
}
//get box
int getbox = 0;
for (int j = i; j >= 0; j--) {
if ((getbox + pickups[j]) <= cap) {
getbox += pickups[j];
pickups[j] = 0;
}
else {
int tmp = cap - getbox;
getbox = cap;
pickups[j] -= tmp;
break;
}
}
answer += (i + 1) * 2;
if (deliveries[flag] > 0 || pickups[flag] > 0) i = flag+1;
}
}
return answer + 1;
}