列表

详情


CMB27. 目的地最短步数

描述

考虑你从家出发步行去往一处目的地,该目的地恰好离你整数单位步长(大于等于1)。你只能朝向该目的地或者背向该目的地行走,而你行走的必须为单位步长的整数倍,且要求你第N次行走必须走N步。
请就给出目的地离你距离,判断你是否可以在有限步内到达该目的地。如果可以到达的话,请计算到达目的地的最短总步数(不能到达则输出-1)。

输入描述

1个整数:目的地离你距离T

输出描述

1个整数:最短总步数(进行了多少次行走)

示例1

输入:

2

输出:

3

说明:

距离目的地2, 需要3步:朝向走1,背向走2,朝向走3

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 256KB, 提交时间: 2020-07-22

/*
#思路,假定一直正向走,则每次都是S+=i,若一直正向走到不了目的地,则至少需要一次反向走,
#假设第j次是反向走的,则总距离减去2*j,必定是个偶数,即不管有多少次反向走,减去的距离都是个偶数,
#则只需要在一直正向走的基础上,找到第一个偶数能够等于正向走的总距离S减去T,即为最短路径
*/
#include<stdio.h>
int main()
{
    int T;
    int sum=1;
    int i;
    scanf("%d",&T);
    for(i=2;;i++)
    {
        sum+=i;
        //if(sum%2==T%2&&sum>=T)
        if((sum-T)%2==0&&sum>=T)
        {
            break;
        }
    }
    printf("%d",i);
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 300KB, 提交时间: 2021-08-21

#include<stdio.h>
#include<math.h>
int main()
{
    long long int t,n,i;
    while(~scanf("%lld",&t))
    {
        n=sqrt(2*t);
        //n=n-1;
        for(n=n-1;;n++)
        {
            if(n*(n+1)>=2*t) break;
        }
        if((n*(n+1)/2-t)%2==0) printf("%d\n",n);
        else if(n%2==0) printf("%d\n",n+1);
        else printf("%d\n",n+2);
    }
}

上一题