解题思路:
最关键的是要有思路:
首先:假设青蛙可以挑的最远的距离是ans, 那么青蛙要在任意一个 ans 长的区间内有一个落脚点,不然就会掉到河里面--这是一次的情况
题中青蛙要往返 2x 次,故每个ans长的区间内的石头的总高度要为 2*x ;
其次:易知满足题设条件且最短的 ans 一定是在 1-n 中,可以采用二分查找的方式来逼近最后的结果
注意事项:
1.要注意循环的条件是 左边界 <= 右边界 (两个值相等那么这个点也可以尝试一下)
2.在输入数据时,采用前缀和的方式来解决某一段区间的数据和问题,这时候也要注意边界条件
参考代码:
//青蛙过河问题 //最关键的思想就是--二分查找 以及 距离为y的区间内一定要有 2x 高度的石头 #include <bits/stdc++.h> using namespace std; const int mmax = 1e5+100; //最大 int hei[mmax]; //用来存放特定位置石头的高度 int front[mmax]; //用来存放前缀和 typedef long long ll; ll ans; //最后答案 ll n,x; //最关键的是如何实现验证 bool isok(ll mid) { //最关键的是--每一个长度为 i 的区间的石头高度和都大于等于2x吗 for(ll i = 1;i<=n-mid;++i) { ll r = i + mid - 1; if(front[r] - front[i-1] < 2 * x) return false; } return true; } int main(){ //输入数 cin>>n>>x; for(int i=1;i<=n-1;++i) { cin>>hei[i]; front[i] = front[i-1] + hei[i]; //a1+a2+...+ai = front_i } //截止到目前为止,数据已经处理完毕 //最大能力肯定在1-n之间 int le = 1; int ri = n; int mid = le + (ri-le)/2; //避免超界 while(le<=ri) //截止循环条件是le<ri { if(isok(mid)) //该点是否可行,可以的话,可以的话,就缩小 { ans = mid; ri = mid - 1; mid = le + (ri-le)/2; } else { le = mid + 1; mid = le + (ri-le)/2; } } cout<<ans<<endl; return 0; }
0.0分
13 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复