內容
傳說在「巴拉巴拉巴拉」(王國名稱)王國曾經有一個被屠殺的小鎮叫做「巴拉巴拉巴拉」(小鎮名稱)
後來「巴拉巴拉巴拉」王國有一群「巴拉巴拉巴拉」(也許是科學家或魔法師之類的)
他們研究發現,「巴拉巴拉巴拉」小鎮被屠村原來是因為遭到了天譴。
特別的是,末日審判的範圍是十字型擴張的。
在方格座標上(假設最中央的格子是 0,0,右 0,1,上-1,0,左 0,-1,下 1,0),
假如範圍是 1,中心座標是 0,0,那麼末日審判的範圍即是下圖的 ● 部分…
○○○○○
○○●○○
○●●●○
○○●○○
○○○○○
範圍 2
○○●○○
○●●●○
●●●●●
○●●●○
○○●○○
範圍 3
○○○●○○○
○○●●●○○
○●●●●●○
●●●●●●●
○●●●●●○
○○●●●○○
○○○●○○○
現在給定審判的中心座標、以及「巴拉巴拉巴拉」王國首都「巴拉巴拉巴拉」(城市名稱)的位置、審判範圍,
請你判斷首都會不會遭受天遣而滅亡。
輸入
共計 10 個測資點。
每個測資點有多組測試資料。
每組測資一行。
第一和第二個數字是天遣的中心座標,
第三和第四個數字是王國首都的座標,(所有座標值保證介於-2147483648~2147483647 之間)
第五個數字是天遣的有效範圍 r(1<=r<=2147483647)
0 0 1 1 1
0 0 1 1 2
0 0 -1 2 3
-1 0 1 2 3
0 0 50 50 100
0 0 50 50 99
輸出
如果首都座標在天遣的範圍內而招致滅亡,請輸出 die
如果首都座標不在天遣範圍而逃過一劫,請輸出 alive
alive
die
die
alive
die
alive
解題思路
審判的距離為曼哈頓距離,所以先求出審判起點和王都的曼哈頓距離後和審判距離比較即可。
輸入測資很大,記得做輸入優化。
完整程式碼
正常版
AC (0.4s, 104KB)
#include <stdio.h>
long long gap(long long num1, long long num2) { return num1 > num2 ? num1 - num2 : num2 - num1; }
int main() { long long dx, dy, cx, cy, da; while (scanf(" %lld %lld %lld %lld %lld", &dx, &dy, &cx, &cy, &da) == 5) { puts(gap(dx, cx) + gap(dy, cy) > da ? "alive" : "die"); } return 0; }
|
輸入優化版
AC (78ms, 1.1MB)
#include <stdio.h> #define BUFSIZ 1048576
inline char readChar() { static char buffer[BUFSIZ], * now = buffer + BUFSIZ, * end = buffer + BUFSIZ; if (now == end) { if (end < buffer + BUFSIZ) return EOF; end = (buffer + fread(buffer, 1, BUFSIZ, stdin)); now = buffer; } return *now++; }
inline char readLongLong(long long* dst) { register char ch; while ((ch = readChar()) < '-') if (ch == EOF) return 0; if (ch == '-') { *dst = readChar() ^ '0'; while ((ch = readChar()) >= '0') * dst = (*dst << 3) + (*dst << 1) + (ch ^ '0'); *dst = ~*dst + 1; } else { *dst = ch ^ '0'; while ((ch = readChar()) >= '0') * dst = (*dst << 3) + (*dst << 1) + (ch ^ '0'); } return 1; }
long long gap(long long num1, long long num2) { return num1 > num2 ? num1 - num2 : num2 - num1; }
int main() { long long dx, dy, cx, cy, da; while (readLongLong(&dx) & readLongLong(&dy) & readLongLong(&cx) & readLongLong(&cy) & readLongLong(&da)) { puts(gap(dx, cx) + gap(dy, cy) > da ? "alive" : "die"); } return 0; }
|