龙脊雪山

发布时间 2024-01-02 21:06:56作者: 凌乱之风

龙脊雪山

时间限制:1s

空间限制:64MB

龙脊雪山是《原神》中的一个地理区域。该地理区域的特点是赋予旅行者「严寒值」,在「严寒值」达到上限时令旅行者持续受到伤害,直至死亡。

在龙脊雪山第 \(t\) 秒内使旅行者累计 \(2t + 3\) 大小的「严寒值」,当严寒值大于等于 \(\text{lim}\),旅行者将会持续受到每秒钟 \(x\) 点的伤害。

现在你以 \(v\) 米每秒的速度登山且有 \(h\) 点生命值,求到达龙脊雪山的最高海拔,并且生命值不会小于等于 \(0\)

输入格式:

输入的第一行包含四个正整数 \(\text{lim}, v, h, x\) \((1 \le \text{lim}, v, h, x \le 10 ^ 9)\)

输出格式:

输出到达龙脊雪山的最高海拔。

输入样例:

5 3 100 2

输出样例:

150

样例解释:

在登山第 \(1\) 秒内累计严寒值 \(5\),超过上限,在第 \(2\) 秒内到第 \(50\) 秒内共受到 \(2 \times 49 = 98\) 点伤害,所以到达龙脊雪山的最高海拔为 \(3 \times 50 = 150\) 米。

STD:

#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main() {
    cin.tie(0) -> sync_with_stdio(0);
    int lim, v, h, x;
    cin >> lim >> v >> h >> x;
    int lim_t = ceil(sqrt(lim + 4)) - 2;
    auto check = [&](int mid) {
    	return h - (mid - lim_t) * x > 0;
    };
    int l = 0, r = 2e9;
    while (l < r) {
    	int mid = l + r + 1 >> 1;
    	if (check(mid)) {
    		l = mid;
    	} else {
    		r = mid - 1;
    	}
    }
    cout << l * v << "\n";
}