2016级算法第一次练习赛-D.AlvinZH的儿时回忆——跳房子

本文介绍了一种简单的算法来解决跳房子游戏问题。通过维护一个变量记录能够到达的最远位置,可以有效地判断是否能够到达最后一个格子。文章还提到了这种思路与染色问题的相似之处,并给出了具体实现代码。

864 AlvinZH的儿时回忆----跳房子

题目链接:https://buaacoding.cn/problem/864/index

思路

这是一道简单题,但是同样有人想复杂了,DP?大模拟?。

本题只要判断能不能到达最后一个格子,又没有问方法数。所以,只需要一个单变量rightMost记录最远能到达的地方,遍历一次数组后比较其与n的大小即可。

分析

经典染色问题的转化:可以把跳格子的过程看成是染色,设在某一时刻,index=m的位置已经被染色了,那么 index=n (n<=m) 的位置肯定已经被染色过了,我们维护一个最右边被染色的点,如果当前枚举点在该点的左侧,那么当前点已经被染色,否则即可停止遍历(因为右边的点再也不可能被染色到了)。最后判断最后一格是否被染色即可解决此问题。

本题可参考:leetcode 55.Jump Game 的三种思路

时间复杂度:\(O(N)\)

空间复杂度:\(O(N)\);

参考代码

//
// Created by AlvinZH on 2017/9/28.
// Copyright (c) AlvinZH. All rights reserved.
//

#include <cstdio>
#define MaxSize 100005

int T,n;
int Step[MaxSize];

int main()
{
    scanf("%d", &T);
    while (T--)
    {
        scanf("%d", &n);
        for (int i = 1; i < n; i++) {
            scanf("%d", &Step[i]);
        }

        int rightMost = 1;
        for (int i = 1; i < n; i++) {
            if(rightMost < i) break;
            rightMost = rightMost > i + Step[i] ? rightMost : i + Step[i];
        }

        if(rightMost >= n) printf("I Win!\n");
        else printf("Too Far!\n");
    }
}

转载于:https://www.cnblogs.com/AlvinZH/p/7698971.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值