zoukankan      html  css  js  c++  java
  • 2018年第九届蓝桥杯第7题 螺旋折线


    标题:螺旋折线

    如图p1.png所示的螺旋折线经过平面上所有整点恰好一次。  
    对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。

     

    例如dis(0, 1)=3, dis(-2, -1)=9  

    给出整点坐标(X, Y),你能计算出dis(X, Y)吗?

    【输入格式】
    X和Y  

    对于40%的数据,-1000 <= X, Y <= 1000  
    对于70%的数据,-100000 <= X, Y <= 100000  
    对于100%的数据, -1000000000 <= X, Y <= 1000000000  

    【输出格式】
    输出dis(X, Y)  


    【样例输入】
    0 1

    【样例输出】
    3
    题解:将每个外围的第一根折线顺时针旋转90°(不影响结果),可以看出是由一个一个正方形构成的图像,所以只需算出所给点内部包围的所以正方形周长ans1和1所给点在最外层的折线长度ans2即可;

    (x,y)点所在的一个正方形的边长的一半为 a=max(abs(x),abs(y))

    ans1=8×(1+2+3+...+a-1)=4*a*(a-1)

    当x>=0时:

        若y>=0,ans2=3a+x+a-y=4a+x-y;

    若y<0,ans2=5a-y+a-x=6a-x-y;

        当x<0,ans=x-(-a)+y-(-a)=2a+x+y;

    #include<iostream>
    #include<math.h>
    #define ll long long
    using namespace std;
    int main()
    {
            ll x,y;
            while(~scanf("%lld %lld",&x,&y))
            {
                    ll a=max(abs(x),abs(y));
                    ll ans2,ans1=4*(a-1)*a;
                    if(x<0){
                            ans2=x+y+2*a;
                    }else{
                            if(y>=0)
                                    ans2=4*a+x-y;
                            else
                                    ans2=6*a-x-y;
                    }
                    printf("%lld
    ",ans1+ans2);
            }
            return 0;
    }
  • 相关阅读:
    Java基础——消息队列
    Java基础——缓存
    Java基础——动态代理
    Java基础——克隆
    Java基础——锁
    Java基础——线程池
    Java基础——线程
    Java基础——HashMap
    Java基础——String
    SpringMVC的学习____5.乱码问题的解决_两种方法(两个类)
  • 原文地址:https://www.cnblogs.com/aeipyuan/p/10704485.html
Copyright © 2011-2022 走看看