結果

問題 No.281 門松と魔法(1)
ユーザー masa
提出日時 2016-07-19 02:42:11
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 2 ms / 1,000 ms
コード長 1,426 bytes
コンパイル時間 688 ms
コンパイル使用メモリ 71,660 KB
実行使用メモリ 6,820 KB
最終ジャッジ日時 2024-11-06 20:47:10
合計ジャッジ時間 2,185 ms
ジャッジサーバーID
(参考情報)
judge5 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 57
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <utility>
#include <string>

using namespace std;

int d, h1, h2, h3;

int calc_h2max() {
	int ans = 0;
	int a = h1;
	int b = h2;
	int c = h3;

	if (b < 2) {
		return -1;
	}

	int n;

	if (b <= a) {
		n = (a - b) / d + 1;
		a -= n * d;
		a = max(a, 0);
		ans += n;
	}

	if (b <= c) {
		n = (c - b) / d + 1;
		c -= n * d;
		c = max(c, 0);
		ans += n;
	}

	if (a != c) {
		return ans;
	}

	if (a == 0) {
		return -1;
	}

	return ans + 1;

}

int calc_h2min() {

	int ans = 0;
	int a = h1;
	int b = h2;
	int c = h3;

	int n;

	int min_ac = min(a, c);

	if (min_ac < 1) {
		return -1;
	}

	if (b >= min_ac) {
		n = (b - min_ac) / d + 1;
		b -= n * d;
		b = max(0, b);
		ans += n;
	}

	if (a != c) {
		return ans;
	}

	a = max(0, a - d);
	ans++;
	if (b < a) {
		return ans;
	}

	b = max(0, b - d);
	ans++;
	if (b != a) {
		return ans;
	}

	return -1;
}


int main() {
	cin >> d >> h1 >> h2 >> h3;

	int ans;
	if (d == 0) {
		if (h1 == h2 || h2 == h3 || h3 == h1) {
			ans = -1;
		} else {
			int mini = min({h1, h2, h3});
			int maxi = max({h1, h2, h3});
			ans = (mini == h2 || maxi == h2) ? 0 : -1;
		}
		cout << ans << endl;
		return 0;
	}

	int ans1 = calc_h2max();
	int ans2 = calc_h2min();


	if (ans1 == -1) {
		ans = ans2;
	} else if (ans2 == -1) {
		ans = ans1;
	} else {
		ans = min(ans1, ans2);
	}

	cout << ans << endl;
	return 0;
}
0