OJ递归青蛙过河问题

 #include<stdio.h>
int jump(int r, int z )
{
    int k;
    if(r==0)
    {
        k=1+z;
    }
    else
    {
        k=2*jump(r-1,z);
    }
    return k;
}
int main()
{
    int s,y,sum;
    while(~scanf("%d %d",&s,&y))
    {
        sum=jump(s,y);
        printf("%d\n",sum);
    }
    return 0;
}

转载于:https://my.oschina.net/mjtao20150609/blog/652005

蓝桥OJ青蛙过河问题描述为,小青蛙住在河边,要到河对岸学校学习,打算通过河里排成直线的石头跳到对岸,每次跳跃必须落在石头或岸上,每块石头有高度,从石头起跳高度会下降1,高度降为0后不能再跳上该石头。输入第一行包含河的宽度`n`和小青蛙去学校的天数`x`,实际过河次数为`2x`;第二行包含`n - 1`个非负整数,表示河中与小青蛙家相距不同位置石头的高度,`Hi > 0`表示有高度为`Hi`的石头,`Hi = 0`表示无石头。 解题思路主要是二分查找结合前缀和优化: 1. 二分查找:跳跃距离的范围是`[0, N]`,在这个范围内二分查找满足条件的最小跳跃距离。 2. 前缀和优化:通过前缀和数组`a`,可以快速计算任意区间内石头高度的总和。 3. 检查函数`check`:对于二分查找得到的中间跳跃距离`mid`,遍历每一个长度为`mid`的区间,计算区间内石头高度总和。如果有任何一个区间内的高度总和小于`2x`,则说明这个跳跃距离太小,需要增大;否则,这个跳跃距离是可行的,尝试减小。 以下是代码实现: ```cpp #include<iostream> #include<cstring> #include<algorithm> using namespace std ; const int N = 1e5 + 10 ; int n , x ; int a[N] ; int b[N] ; bool check(int mid){ bool flag = 1 ; for(int i = 0, j = mid; j < n ; j ++, i ++){ // 遍历每一个区间 int sum = a[j] - a[i]; if(sum >= 2*x) continue ; else flag = 0 ; // 如果有任何一个区间内的高度小于2*x 那这个跳跃距离就小了,要变大 } return flag ; } int main(){ cin >> n >> x ; for(int i = 1 ; i < n ; i ++){ cin >> a[i] ; a[i] += a[i-1]; // 这里借助前缀和来优化 } int l = 0 , r = N ; while(l < r){ // 二分 int mid = (l + r) >> 1 ; if(check(mid)) r = mid ; else l = mid + 1 ; } cout << l << endl ; return 0 ; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值