有t次询问,每次询问会给n个L, R,其中第 i 段从坐标为L[i]的点开始,到坐标为R[i]的点结束。
玩家从坐标为 0 的点开始通关。在一次移动中,他们可以移动到距离不超过 k 的任意一点。
在第i次移动后,玩家必须落在第i段之内,即在坐标x处,使得 L[i]≤x≤R[i]。
这意味着,每次移动都必须在L[i] ~ R[i]
如果玩家按照上述规则到达了第 n个段落,那么这一关就算完成了。
为了不希望这个关卡太简单,所以要求确定可以完成这个关卡的最小整数k。
解题思路
核心思想就是二分答案.
代码
#include<bits/stdc++.h>
#define int long long #define endl '\n' constint INF = 0x3f3f3f3f;
voidsolve(){ int n; std::cin >> n; std::vector<int> L(n, 0ll), R(n, 0ll); for(int i = 0 ; i < n ; i ++) std::cin >> L[i] >> R[i]; int l = 0, r = 1e16 + 50; auto check = [&] (int x){ int ma = 0, mi = 0; for(int i = 0 ; i < n ; i ++){ ma = std::min (ma + x, INF); mi = std::max (mi - x, 0ll); mi = std::max(mi, L[i]); ma = std::min(ma, R[i]); if(mi > ma) returnfalse; } returntrue; }; while(l < r){ int mid = (l + r) >> 1; if(check (mid)) r = mid; else l = mid + 1; } std::cout << r << endl; }
signedmain(){ std::ios::sync_with_stdio(false); std::cin.tie(nullptr), std::cout.tie(nullptr); int Lazy_boy_ = 1; std::cin >> Lazy_boy_; while (Lazy_boy_--) solve(); return0; }