【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;
}
思路二:
二分最高点。