1. 程式人生 > >[Vijos1763]Wormhole (貪心/模擬?)

[Vijos1763]Wormhole (貪心/模擬?)

已經是NOIP考前的最後一天了

現在在杭州的賓館裡

因為自己沒帶電腦

因此用ADMAN的電腦

題目描述

一維的世界就是一個數軸。這個世界的狹小我們幾乎無法想象。

在這個數軸上,有N個點。從左到右依次標記為點1到N。第i個點的座標為Xi。經過漫長時間的物理變化和化學變化,這個一維世界中產生了一個高等智慧文明,而這N個點都成為了這個文明的一座城市。而點1則成為了這個文明的首都。

出於政治上和經濟上的需要,首都不能和任何城市相距太遠。所以政府決定在某兩個城市耗巨資修建蟲洞。一個修建了蟲洞的城市可以瞬移到另一個修建了蟲洞的城市,從而大大縮短了N個城市相互之間的距離。原先從任意城市i到城市j的路程等於它們的距離|Xi - Xj|,而現在若兩個城市附近都有修建了蟲洞的城市,則可以先從i移動到附近的蟲洞瞬移到城市j附近的蟲洞再移動到j。

政府希望在兩個合適的城市修建蟲洞,使得修建蟲洞以後從點1移動到任意城市經過的最短路程的最大值儘量小。請你計算這個路程的最小值是多少。

輸入包含多組資料。

格式

輸入格式

第一行包括一個正整數T,表示有T組測試資料。接下來依次是T組測試資料。

每組測試資料的第一行包括一個整數N,表示有N個城市。第二行,N個遞增的整數,依次表示N個城市的座標。

輸出格式

輸出檔案包括T行,每行一個整數,依次表示每組測試資料的答案。

樣例

2
3
0 1 21
5
0 100 101 102 103
樣例輸入
1
2
樣例輸出

 

思路

我覺得是一個很好的題目了

第一次提交我才10……

大致就是列舉第二個蟲洞的位置

然後取值就可以

 

在這裡附上一個大佬的題解

我的方法是O(n)的,木有下面的二分神。
題意就是加一條權值為0的邊,使得最遠點距離最小.
容易證明邊的起點一定是1.
那麼可以列舉邊的終點。
假設邊的終點在點X,那麼可以分2部分來計算,1-X之間的點和點X+1-N.顯然後面部分中最遠的點是N。
對於前面部分,距離最遠的點肯定是在中間的(就是它到1的距離和到X的距離儘可能接近),假設是Y,顯然當X變大的時候,Y也會變大,只要移動一下就可以了。

程式碼

#include<cstdio>
#include
<cstring> #include<algorithm> using namespace std; int a[200005]; int main() { int T;scanf("%d",&T); while(T--) { int j=2; int ans=0x7fffffff; memset(a,0,sizeof(a)); int n;scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); ans=max(a[2]-a[1],a[n]-a[2]); for(int i=3;i<=n;i++) { while(j<i && a[i]-a[j]>a[j]-a[1]) ++j; ans=min(max(a[i]-a[j],max(a[j-1]-a[1],a[n]-a[i])),ans); } printf("%d\n",ans); } return 0; }