(二分|| 贪心) acwing 730. 机器人跳跃问题

730. 机器人跳跃问题

题目链接https://www.acwing.com/problem/content/description/732/
题目
(二分|| 贪心) acwing 730. 机器人跳跃问题_第1张图片
思路一:二分的方法来做,时间复杂度为0(nlogn)

#include
#include
using namespace std;
int h[100010];
int n;
bool pd(int u){
    for(int i=0;i<n;i++){
        //if(u>=h[i]) u+=(u-h[i]);
        //else u-=(h[i]-u);
        u=2*u-h[i];//上面相当于下面
        if(u<0) return false;
        if(u>1e5) return true;//不加这个可能爆int
    }
    return true;
}
int main(){

    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&h[i]);
    int l=1,r=100000;
    while(l<r){//求最小值
        int mid=l+r>>1;
        if(pd(mid))
            r=mid;
        else
            l=mid+1;
    }
    cout<<l;
    return 0;
}

思路二:贪心的思想,从最后面开始递推,最优就是成功到达最后一个点时,能量为0,时间复杂度为0(n)
下面是我写的一个推理过程(字丑,勿怪)^_^

(二分|| 贪心) acwing 730. 机器人跳跃问题_第2张图片

#include
#include
using namespace std;
int h[100010];
int n;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&h[i]);
    double ans=0;//代替数组,做了一个空间优化
    for(int i=n;i>0;i--){
        ans=(h[i]+ans)/2;//ans要是浮点数,因为不能确保被整除
    }
    int t=(int)ans;
    if(t<ans) cout<<t+1;
    else cout<<t;
    return 0;
}

你可能感兴趣的:(AcWing,算法,c++,二分法,贪心算法)