前言
蓝桥杯的题目真有意思。
题目比较实际化,所以这个题目的难度也就一般般,因为动手画画就能画出来。这个题是B组决赛最后一题吧。总感觉省赛的题目比较难
正文
这个题目的问法就很二分,我们直接二分起来。
check()中有贪心的成分,所以算法的正确性我确实证明不出来。然后他可以AC啊
直观上看,我们按右端点排序,然后移动到比较靠近没有覆盖的地方,就可以了。这样因为是有序的区间,所以移动的距离也是最小的。
我们怎么check()呢?
我先放上check()的代码,然后逐条解读:
bool check(int x)
{
int k = 0;
vector<node> tmp(reg);
while(true)
{
bool found = false;
for(int i=0;i<tmp.size();i++)
{
node now = tmp[i];
int ta = now.a;
int tb = now.b;
if(ta-x<=k && tb+x>=k)
{
found = true;
int len = tb-ta;
if(ta