解题思路:
最关键的是要有思路:
首先:假设青蛙可以挑的最远的距离是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分
19 人评分
C语言程序设计教程(第三版)课后习题10.5 (C语言代码)浏览:767 |
【回文数(二)】 (C++代码)浏览:932 |
C语言程序设计教程(第三版)课后习题5.8 (C语言代码)浏览:806 |
C语言程序设计教程(第三版)课后习题6.7 (C语言代码)浏览:674 |
printf基础练习2 (C语言代码)浏览:321 |
WU-蓝桥杯算法提高VIP-交换Easy (C++代码)浏览:1186 |
wu-淘淘的名单 (C++代码)浏览:1532 |
三角形 (C++代码)递推浏览:825 |
2005年春浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:637 |
C语言程序设计教程(第三版)课后习题7.2 (C语言代码)浏览:570 |
hsk 2023-04-17 10:44:13 |
哈哈,谢谢支持