日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

教主的花园

發(fā)布時間:2025/3/15 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 教主的花园 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Description

【問題背景】
  LHX教主最近總困擾于前來膜拜他的人太多了,所以他給他的花園加上了一道屏障。

【問題描述】
  可以把教主的花園附近區(qū)域抽像成一個正方形網(wǎng)格組成的網(wǎng)絡(luò),每個網(wǎng)格都對應(yīng)了一個坐標(biāo)(均為整數(shù),有可能為負(fù)),若兩個網(wǎng)格(x1, y1),(x2, y2)有|x1 – x2| + |y1 – y2| = 1,則說這兩個網(wǎng)格是相鄰的,否則不是相鄰的。
  教主在y = 0處整條直線上的網(wǎng)格設(shè)置了一道屏障,即所有坐標(biāo)為(x, 0)的網(wǎng)格。當(dāng)然,他還要解決他自己與內(nèi)部人員的進出問題,這樣教主設(shè)置了N個入口a1, a2, …, aN可供進出,即對于y = 0上的所有網(wǎng)格,只有 (a1, 0),(a2, 0), ……, (aN, 0) 可以通過,之外的所有縱坐標(biāo)為0的網(wǎng)格均不能通過,而對于(x, y)有y不為0的網(wǎng)格可以認(rèn)為是隨意通過的。
  現(xiàn)在教主想知道,給定M個點對(x1, y1),(x2, y2),并且這些點均不在屏障上,詢問從一個點走到另一個點最短距離是多少,每次只能從一個格子走到相鄰的格子。

Input
  輸入的第1行為一個正整數(shù)N,為屏障上入口的個數(shù)。
  第2行有N個整數(shù),a1, a2, …, aN,之間用空格隔開,為這N個入口的橫坐標(biāo)。
  第3行為一個正整數(shù)M,表示了M個詢問。
  接下來M行,每行4個整數(shù)x1, y1, x2, y2,有y1與y2均不等于0,表示了一個詢問從(x1, y1)到(x2, y2)的最短路。

Output
  輸出共包含m行,第i行對于第i個詢問輸出從(x1, y1)到(x2, y2)的最短路距離是多少。

Sample Input
2
2 -1
2
0 1 0 -1
1 1 2 2

Sample Output
4
2

Data Constraint

Hint

【數(shù)據(jù)規(guī)模】
  對于20%的數(shù)據(jù),有n,m≤10,ai,xi,yi絕對值不超過100;
  對于40%的數(shù)據(jù),有n,m≤100,ai,xi,yi絕對值不超過1000;
  對于60%的數(shù)據(jù),有n,m≤1000,ai,xi,yi絕對值不超過100000;
  對于100%的數(shù)據(jù),有n,m≤100000,ai,xi,yi絕對值不超過100000000。
.
.
.
.
.
.
.
.

分析

題目大意就是在一個平面直角坐標(biāo)系中x軸上是一道屏障,但上面有n個開頭,要求兩個點的距離
顯然,這題可以分類討論來做
①兩個點的y坐標(biāo)同號,直接求曼哈頓距離輸出
如果不行,則二分一個在中間的開口
②如果這個開口位于兩個點中間,求出兩個點分別到開口的曼哈頓距離相加并輸出
③否則判斷一下它距離哪一個端點近,就由哪里繞過去
雖然此時的pos值不一定準(zhǔn)確,但十分接近,真實值一定出現(xiàn)在pos-1,pos,pos+1中,求最小值輸出就好了
.
.
.
.
.
.
.

程序:
uses math; var x1,y1,x2,y2,i,n,m,pos:longint; a:array[-1..100002]of longint; t1,t2,t3:int64;procedure swap(x,y:longint); var xc:longint; beginxc:=x1;x1:=x2;x2:=xc; end;function find(x:longint):longint; var l,r,mid,k:longint; beginl:=1;r:=n;k:=n;while l<=r dobeginmid:=(l+r) div 2;if a[mid]<x then l:=mid+1 elsebeginr:=mid-1;k:=mid;end;end;exit(k); end;procedure kp(l,r:longint); var i,j,mid:longint; beginif l>=r then exit;i:=l;j:=r;mid:=a[(i+j) div 2];repeatwhile a[i]<mid do inc(i);while a[j]>mid do dec(j);if i<=j thenbegina[-1]:=a[i];a[i]:=a[j];a[j]:=a[-1];inc(i);dec(j);end;until i>j;kp(l,j);kp(i,r); end;beginreadln(n);for i:=1 to n doread(a[i]);kp(1,n);readln;readln(m);for i:=1 to m dobeginreadln(x1,y1,x2,y2);if (y1<0)and(y2<0)or(y1>0)and(y2>0) thenbeginwriteln(abs(x1-x2)+abs(y1-y2));continue;end;if x1>x2 then swap(x1,x2);pos:=find((x1+x2) div 2);if (a[pos]>=x1)and(x2>=a[pos]) then writeln(abs(x1-x2)+abs(y1-y2)) elsebegint1:=abs(a[pos]-x1)+abs(a[pos]-x2)+abs(y1-y2);t2:=200000000;t3:=200000000;if pos>1 then t2:=abs(a[pos-1]-x1)+abs(a[pos-1]-x2)+abs(y1-y2);if pos<n then t3:=abs(a[pos+1]-x1)+abs(a[pos+1]-x2)+abs(y1-y2);t1:=min(t1,t2);t1:=min(t1,t3);writeln(t1);end;end; end.

轉(zhuǎn)載于:https://www.cnblogs.com/YYC-0304/p/9499978.html

與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的教主的花园的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。