【JZOJ 4303】爬山

题目大意:

初始点在 \(A\)\(n\) 个单位时间后在 \(B\),一个单位时间可上下不超过 \(d\),问这过程中最高可达多少米。

正文:

方法一:

思路:

可以先跳到够的着 \(B\) 的位置,再将时间分成两份,一份去够最高点,一份从最高点回 \(B\)

代码:

int main()
{
	scanf("%lld %lld %lld %lld",&n,&d,&a,&b);
	n--;
	if (abs(a - b) % d != 0)
	{
		m = abs(a - b) / d + 1;
		n -= m;
		if (n % 2 == 1)
		{
			printf("%lld", min(a, b) + m * d + n / 2 * d);
		}
		else
		{
			printf("%lld", max(a, b) + n / 2 * d);
		}
	}
	else
	{
		printf("%lld", max(a, b) + (n - abs(a - b) / d) / 2 * d);
	}
	return 0;
}

思路二:

二分最高点。

posted @ 2020-08-10 17:47  Jayun  阅读(84)  评论(0编辑  收藏  举报