设计开发网站,wordpress虚拟商城,网站策划方案ppt,厦门网站设计公司推荐题目描述#xff1a; 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行#xff0c;河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间#xff0c;有N块岩石(不含起点和终点的岩石)。在比赛过程中#xff0…题目描述 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间有N块岩石(不含起点和终点的岩石)。在比赛过程中选手们将从起点出发每一步跳向相邻的岩石直至到达终点。 为了提高比赛难度组委会计划移走一些岩石使得选手们在比赛过程中的最短跳跃距离尽可能长。由于预算限制组委会至多从起点和终点之间移走M块岩石(不能移走起点和终点的岩石)。 输入描述: 输入文件第一行包含三个整数LNM分别表示起点到终点的距离起点和终点之间的岩石数以及组委会至多移走的岩石数。 接下来 N行每行一个整数第i行的整数Di(0 Di L)表示第i块岩石与起点的距离。这些岩石按与起点距离从小到大的顺序给出且不会有两个岩石出现在同一个位置。 输出描述: 输出文件只包含一个整数即最短跳跃距离的最大值。 示例1 输入 25 5 2 2 11 14 17 21 输出 4 说明 将与起点距离为2和14的两个岩石移走后最短的跳跃距离为4(从与起点距离17的岩石跳到距离21的岩石或者从距离21的岩石跳到终点)。 二分查找算法板子整数
1、左面模板
//左面模板
int bsearch_1(int l, int r)
{while (l r){int mid l r 1;if (check(mid)) r mid;else l mid 1;}return l;
}
2、右面模板
//右面模板
int bsearch_2(int l, int r)
{while (l r){int mid l r 1 1;if (check(mid)) l mid;else r mid - 1;}return l;
} 根据样例图解如下 根据如上图解我们可以 看出根据 d 的增加移动石头次数 m 也是逐渐增加的所以d 5不行那么说明d 5 的 情况都是不行的所以答案是d 4移动次数m 2。 代码思路 1、写好对应的数组 2、确定好二分的板子 3、写好check函数 AC代码如下
#includeiostream
#includealgorithm
#includecstringusing namespace std;const int N 50010;
int L,n,m;
int a[N];bool check(int x)
{//cnt,表示移动石头的次数last 表示指向没有移动过的石头int cnt 0,last 0;for(int i1;in;i){//判断一下两个石头之间的距离是否小于这个最短跳跃距离if(a[i] - a[last] x){cnt ; //移动石头次数增加}else{last i; //last永远指在没被挪动的石头上面}if(cnt m) return false;}return true;
}int main()
{scanf(%d %d %d,L,n,m);//因为算是起点和终点的话是N2个数for(int i1;in;i) scanf(%d,a[i]);a[n1] L; //终点int l 1,r L;/*这里为啥不用左模板 是因为 在一个有序的数组下我们想要找到最长的那个一定是在最右边。*/while(l r){int mid l r 1 1;if(check(mid)) l mid;else r mid - 1;}cout l endl;return 0;
}
如果last那块不懂的话大家可以拿题目给的样例去手动模拟一下好好理解代码的过程感谢观看~