蓝桥杯-区间移位 有空继续写
#include <iostream>
using namespace std;
const int N = 1e4 + 10;
int n;
struct dic
{
int u;
int v;
}
vector <dic> q;
bool check(double x) // 相当于给多一个位移最大为x的条件
{
double stand = 0; //现在的位置(当前最远能够站到的位置)
for (int i = 0; i < n; i++)
{
if (q[i][0] > stand) //需要左移
{
double max1 = q[i][0] - stand; //需移多少
if (max1 > x) return 0; //越界了
else //左移没有越界
{
stand += q[i][1] - q[i][0];
}
}
else //不需要左移 但是可以右移
{
stand = q[i][1] + x;
}
}
if (stand >= 1e4)return 1;
else return 0;
}
int main()
{
cin >> n;
int a,b;
for (int i = 0; i < n; i++) cin >> a >> b;
q.push_back({a,b});
sort() //把二维数组排序--需要vector
double l = 0, r = 1e4;
while ((r - l) > 1e-11)
{
double mid = ( l + r )/2;
if (check(mid)) r = mid;
else l = mid;
}
if (l-(int)l >0.9 ) //19.9999
{
printf("%d", (int)l+1);
}
else if (l - (int)l < 0.001)printf("%d", (int)l); //20.001
else printf("%.1lf", l); //小数
return 0;
}