// yukicoder: 281 門松と魔法(1) // 2019.6.3 bal4u #include #define INF 0x55555555 int check(int *h) { if (h[0] == h[1] || h[1] == h[2] || h[0] == h[2]) return 0; if (h[0] < h[2]) { return (h[1] < h[0] || h[1] > h[2]); } else { return (h[1] > h[0] || h[1] < h[2]); } } int d, ans; void rec(int *h, int id, int c) { int i, t; if (id == 3) { if (check(h) && c < ans) ans = c; return; } t = h[id]; for (i = 0; i <= 2; i++) { if (h[id] < 0) h[id] = 0; rec(h, id+1, c+i); if (h[id] == 0) break; h[id] -= d; } h[id] = t; } void cutr(int h1, int h2, int h3) { int g[3]; g[0] = h1, g[1] = h2; int t = (h3-h2-1)/d+1; h3 -= t*d; if (h3 < 0) h3 = 0; g[2] = h3; if (check(g)) { if (t < ans) ans = t; return; } h3 -= d; if (h3 < 0) h3 = 0; g[2] = h3, t++; if (check(g)) { if (t < ans) ans = t; } } void cutc(int h1, int h2, int h3) { int g[3]; g[0] = h1, g[2] = h3; int t = (h2-h1-1)/d+1; h2 -= t*d; if (h2 < 0) h2 = 0; g[1] = h2; if (check(g)) { if (t < ans) ans = t; return; } h2 -= d; if (h2 < 0) h3 = 0; g[2] = h2, t++; if (check(g)) { if (t < ans) ans = t; } } int main() { int h[3]; scanf("%d%d%d%d", &d, h, h+1, h+2); if (d == 0) { puts(check(h)? "0": "-1"); return 0; } ans = INF; rec(h, 0, 0); if (ans == INF) { if (h[0] < h[1] && h[1] < h[2]) { cutr(h[0], h[1], h[2]); cutc(h[0], h[1], h[2]); } else if (h[0] > h[1] && h[1] > h[2]) { cutr(h[2], h[1], h[0]); cutc(h[2], h[1], h[0]); } } if (ans == INF) ans = -1; printf("%d\n", ans); return 0; }