2018年第九屆藍橋杯【C++省賽B組】【第七題:螺旋折線】——題目規律及解題源碼

2018年第九屆藍橋杯題目彙總

https://blog.csdn.net/qq_34202873/article/details/79784728


第七題

標題:螺旋折線

如圖p1.png所示的螺旋折線經過平面上所有整點恰好一次。

對於整點(X, Y),我們定義它到原點的距離dis(X, Y)是從原點到(X, Y)的螺旋折線段的長度。

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

給出整點座標(X, Y),你能計算出dis(X, Y)嗎?

【輸入格式】
XY  

對於40%的數據,-1000 <= X, Y <= 1000  
對於70%的數據,-100000 <= X, Y <= 100000  
對於100%的數據, -1000000000 <= X, Y <= 1000000000  

【輸出格式】
輸出dis(X, Y)  
【樣例輸入】
0 1

【樣例輸出】
3

解題思路:

只要找出Y軸上所有點的座標規律(稱之爲橫向關鍵點),即求出後與該點所在同一橫線上的距離也都可以求出了。
規律:

y > 0 時:
當abs(x) <= y時,dis(0 , y)=3 * y + (y * y - y) / 2  * 8,所以dis(x , y)=dis(0 , y) + x;
當abs(x) > 時, x  > 0時,dis(x , y) = dis(0 , x) + 2 * x - y。
                        x <  0時,dis(x , y) = dis(0 ,-x) + 2 * x + y。 

當y <= 0時:
當y-1 <= x <= -y 時,dis(0 , -y) = 7 * -y + (y * y + y)/2 * 8,所以dis(x , y) =dis(0 , y) - x;
當x >- y 或 x< y - 1時,x > 0 時,dis(x,y) = dis(0 , x) - 2 * x - y。               
                       x < 0 時,dis(x,y) = dis(0 , -x - 1) - 2 * x + y - 1

代碼

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
int main()
{
    ll x , y;
    ll res;
    cin>>x>>y;
    if(y > 0)
    {   
        if(abs(x)<=y)
            res = 3*y+(y*y-y)/2*8+x;    
        else
        {
            if(x > 0)
                res=3*x+(x*x-x)/2*8+2*x-y;

            else
                res=3*-x+(x*x+x)/2*8+2*x+y;
        }
    }
    else
    {
        if(y-1 <= x &&x <= -y)
            res=7*-y+(y*y+y)/2*8-x;
        else
        {
            if(x > 0)
                res=7*x+(x*x-x)/2*8-2*x-y;
            else
                res=-7*x-7+(x*x+3*x+2)/2*8-2*x+y-1;
        }
    }
    cout<<res;
    return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章