結果
問題 | No.281 門松と魔法(1) |
ユーザー |
![]() |
提出日時 | 2018-10-31 07:38:08 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 40 ms / 1,000 ms |
コード長 | 2,709 bytes |
コンパイル時間 | 1,613 ms |
コンパイル使用メモリ | 193,288 KB |
最終ジャッジ日時 | 2025-01-06 15:11:15 |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 57 |
ソースコード
#include <bits/stdc++.h>using namespace std;using i64 = int64_t;using vi = vector<i64>;using vvi = vector<vi>;int solve(int d, int a, int b, int c) {if (a == c) {assert(a == 0 && c == 0);return -1;}if (a < b && b > c) {return 0;}if (a > b && b < c) {return 0;}if (d == 0 || b == 0) {return -1;}int ans0 = -1, ans = -1;int k = min(a, c);// lower bif (k != 0) {int diff = b - (k - 1);ans0 = (diff + d - 1) / d;}// lower a, ck = max(a, c);if (k != 0) {int diff = k - (b - 1);int t = (diff + d - 1) / d;// lower cif (a < c) {int cc = max(0, c - d * t);int aa = a;if (a == b) {if (a > 0) {aa = max(0, a - d);if (aa != cc) {ans = t + 1;} else if (aa > 0 || cc > 0) {ans = t + 2;}}} else {if (a == cc) {if (a > 0 || cc > 0) {ans = t + 1;}} else {ans = t;}}} else {int aa = max(0, a - d * t);int cc = c;if (c == b) {if (c > 0) {cc = max(0, c - d);if (aa != cc) {ans = t + 1;} else if (aa > 0 || cc > 0) {ans = t + 2;}}} else {if (aa == c) {if (aa > 0 || c > 0) {ans = t + 1;}} else {ans = t;}}}}if (ans0 == -1) {return ans;} else if (ans == -1) {return ans0;} else {return min(ans0, ans);}}int main() {int d;int a, b, c;cin >> d >> a >> b >> c;if (a != c) {cout << solve(d, a, b, c) << endl;} else {if (d == 0) {cout << -1 << endl;return 0;}int ret1 = 1 + solve(d, max(0, a - d), b, c);int ret2 = 1 + solve(d, a, b, max(0, c - d));if (ret1 == 0 && ret2 == 0) {cout << -1 << endl;} else if (ret1 == 0) {cout << ret2 << endl;} else if (ret2 == 0) {cout << ret1 << endl;} else {cout << min(ret1, ret2) << endl;}}}