• cf 11B Jumping Jack(贪心,数学证明一下,,)


    题意:

    给一个数X。

    起始点为坐标0。第1步跳1格,第2步跳2格,第3步跳3格,.....以此类推。

    每次可以向左跳或向右跳。

    问最少跳几步可以到坐标X。

    思路:

    假设X是正数。

    最快逼近X的方法是不停向右走。如果越过了X,假设到了X1,则必有X1-X小于最后一步d。

    如果X1-X是偶数,将之前的某个x变为-x。则可以到X。

    如果X1-X是奇数,因为将之前的某个x变为-x,实际是后退2x格。所以必定要再向右走一步。直到X1-X是偶数。(其实只要走一步或两步)

    X是负数的情况和X是正数的情况一样。

    代码:

    ll  x,d;
    
    
    int main(){
    
        cin>>x;
        if(x==0){
            puts("0");
            return 0;
        }
        if(x<0){
            x=-x;
        }
        d=1;
        while(d*(d+1)/2<x) ++d;
        if(d*(d+1)/2==x){
            printf("%I64d
    ",d);
        }
        else{
            ll x1=d*(d+1)/2;
            ll deta=x1-x;
            if(deta%2==0){
                printf("%I64d
    ",d);
            }
            else{
                while(deta%2!=0){
                    ++d;
                    x1+=d;
                    deta=x1-x;
                }
                printf("%I64d
    ",d);
            }
        }
    
        return 0;
    }
  • 相关阅读:
    AVL树的旋转操作详解
    KMP算法的优化与详解
    手机号码等的正则验证
    Josephus问题的java实现
    Match类解析
    this的相关介绍与用法
    Iterator——迭代接口
    final对于访问效率的影响
    final关键字介绍
    JAVA事件监听机制与实现
  • 原文地址:https://www.cnblogs.com/fish7/p/4309563.html
Copyright © 2020-2023  润新知