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;
}
原文地址:https://www.cnblogs.com/aeipyuan/p/10704485.html