目的地最短步数

目的地最短步数

https://www.nowcoder.com/practice/24ec35c2a8054a7b831a5a3ea660d729?tpId=98&tqId=32875&tPage=3&rp=3&ru=%2Fta%2F2019test&qru=%2Fta%2F2019test%2Fquestion-ranking

题目难度:二星
考察点:归纳

方法:归纳、找规律

1.分析:

这个题目其实就是相当于在1, 2, 3, 4....n中加正负号得到一个目标target,不需要BFS,我们可以采用贪心归纳的方法,因为我们要尽可能向右移动到达目的地,我们假设1+2+3+...+k=sum。那么就有如下两种情况:
(1). 如果sum=target,那么显然k就是我们要求的答案。
(2). 如果sum>target,那么sum-target就又存在两种情况:
a.sum-target是偶数,其实我们可以翻转其中某个数字的符号就可以变成target了。举个例子,假设sum-target=6,那么我们只需要把3变-3,那么此时显然sum减小了6,所以就能得到target了,即1+2+...-(sum-target)/2+...+k=target,所以此时答案为k。
b. sum-target是奇数,那么sum-(target-1)就变成了一个偶数,所以类似上面的证明举个例子,假设sum-target=5,那么我们只需要将3变成-3,就可以得到target-1了,即1+2+...-(sum-target+1)/2+...+k=target-1
此时我们在上述情况的基础上来考虑一下k的奇偶性,显然有两种情况:
(b.1) k是数,且满足k >sum-target+1,那么就有1+2+...-(sum-target+1)/2+....-(k/2)...+k+(k+1)=sum+(k+1)-sum+target-1-k=target,那么显然此时答案为k+1,
(b.2) k是数,同理可得1+2+...-(sum-target+1)/2.....+k-(k+1)+(k+2)=sum-(sum-target+1)+1=target,此时答案为k+2。
所以综上所述,他必能走到目的地,不存在走不到的情况。

算法实现:
(1). 输入n。
(2). 按照上述的推理判断情况。
(3). 根据判断的几种情况,输出结果ans。

2.复杂度分析:

时间复杂度:O(sqrt(n)) 
空间复杂度:O(1)

3.代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n; cin>>n;
    int ans = 0, sum = 0;
    while(sum < n) {
        ans++;
        sum += ans;
    }
    sum -= n;
    if(sum & 1) {
        if(ans & 1) cout<<ans+2<<endl;
        else cout<<ans+1<<endl;
    }
    else cout<<ans<<endl;
    return 0;
}



全部评论

相关推荐

2本硕,在这一个下午真的绷不住了,浪费了太多时间,现在的技术栈还停在C语言和stm32上,找嵌入式的实习面试被拷打,找杭州的一个也找不到,真的心里难受,linux没学过,研二了开始慌了。
一条淡水魚:嵌入式这行的面试我认为实际项目比较重要,技术栈简单的提一嘴就行,面试官在乎的关键点在于你用了这些技术做了哪些工作解决了什么问题,而不是停留在离散的那些个技术栈上,那除了教课没有意义,好比你提到的c语言和32,你用32做过哪些具体的项目?接触过什么外设?使用过哪些公司的SDK?有没有实际产品落地?以及各种只有进入真正的生产环节当中才会积累到的经验......主动去和面试官讨论这些实际的问题,甚至还能就某个具体参数的合理性与他去简单探讨一下,只要技术栈对口,基本上就稳啦~(另外linux和RTOS是嵌入式的标配哦,选一个方向走下去吧)
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务