题目意思是:有k个区间,每一个的左边为l,右边为r。刚开始你的点在0,每一次操作可以把点移动至多k个单位,但要让你的点的pos一直在[l,r]。要求求出最小的k。
二分答案其实我也一直不是很会,emmm。
如果k的值比答案大的话,那么肯定是可以的,所以直接二分就行。
#include<bits/stdc++.h>
using namespace std;
void durant()
{
int n;
cin>>n;
vector<pair<int,int>>v(n);
for(auto &[l,r]:v) cin>>l>>r;
int left=0,right=1e9+10,ans;
while(left<right){
int f=0,mid=(left+right)/2;
int close=0,far=0;
for(auto &[l,r]:v){
close=max(l,close-mid);
far=min(r,far+mid);
if(far<l||close>r){
f=1;
break;
}
}
if(f){//小了
left=mid+1;
}else{
right=mid;
ans=mid;
}
}
cout<<ans<<'\n';
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--)
durant();
return 0;
}
如果不满足条件则说明k太小,得试试更大的,否则就得试更小的嘛。