https://www.acmicpc.net/problem/2828
N칸으로 나눠져 구성된 스크린 위에서 사과가 여러개 떨어진다. M칸의 바구니를 가지고 떨어지는 사과를 모두 담으려할 때 바구니의 이동거리의 최솟값을 구하는 문제다.
이런 문제는 바구니의 시작점과 끝점을 따로 지정해서 그 범위 안에 사과가 떨어지는지 아닌지 체크하면 된다.
바구니의 시작점: l
바구니의 끝점: r=l+(m-1)
만약 바구니 범위를 벗어난 곳에서 사과가 떨어진다면 l과 r의 범위를 재설정 해주고 그 만큼 이동한 것이므로 이동거리를 증가시켜주면 된다.
#include <iostream>
using namespace std;
int n, m, j, temp, ret;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> m >> j;
int l = 1;
for (int i = 0; i < j; i++) {
int r = l + m - 1;
cin >> temp;
if (temp >= l && temp <= r)continue;
else{
if (temp < l) {
ret += l - temp;
l =temp;
}
else {
l += temp - r;
ret += temp - r;
}
}
}
cout << ret;
}