第九屆藍橋杯省賽 (7) -- 螺旋折線
阿新 • • 發佈:2018-11-09
標題:螺旋折線
如圖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
資源約定:
峰值記憶體消耗(含虛擬機器) < 256M
CPU消耗 < 1000ms
請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘內容。
注意:
main函式需要返回0;
只使用ANSI C/ANSI C++ 標準;
不要呼叫依賴於編譯環境或作業系統的特殊函式。
所有依賴的函式必須明確地在原始檔中 #include <xxx>
不能通過工程設定而省略常用標頭檔案。
提交程式時,注意選擇所期望的語言型別和編譯器型別。
思路:把圖都當做若干個正方形巢狀。max(abs(a),abs(b))為第n個正方形,周長為 8*n。總長等於內嵌的所有正方形的周長總和,再加上該點在此正方形的長度之和,通過分類四條邊來計算其值,注意正方形左下角的點歸於第四條邊。。
#include<stdio.h> #include<stdlib.h> #define maxabs(a,b) (abs(a)>abs(b)?abs(a):abs(b)) long long sum(long x,long y) { long n = maxabs(x,y); long long sum = 4*n*(n-1); // 裡面的正方形邊長 if(x==0 && y==0) return 0; else if(x == -n && y != -n) { sum += (y+n); } else if(y == n) { sum += 2*n+(x+n); } else if(x == n) { sum += 4*n+(n-y); } else { sum += 6*n+(n-x); } return sum; } int main() { int a,b; scanf("%d %d",&a,&b); printf("%d",sum(a,b)); }
總結:abs函式屬於#include <stdlib.h>標頭檔案中