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)嗎?
【輸入格式】
X和Y
對於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;
}