河中跳房子

2021-08-20 05:37:59 字數 1790 閱讀 9755

時間限制: 1000 ms         記憶體限制: 65536 kb

提交數: 485     通過數: 227 

每年奶牛們都要舉辦各種特殊版本的跳房子比賽,包括在河裡從乙個岩石跳到另乙個岩石。這項激動人心的活動在一條長長的筆直河道中進行,在起點和離起點l遠 (1 ≤ l≤ 1,000,000,000) 的終點處均有乙個岩石。在起點和終點之間,有n (0 ≤ n ≤ 50,000) 個岩石,每個岩石與起點的距離分別為di (0 < di < l)。

在比賽過程中,奶牛輪流從起點出發,嘗試到達終點,每一步只能從乙個岩石跳到另乙個岩石。當然,實力不濟的奶牛是沒有辦法完成目標的。

農夫約翰為他的奶牛們感到自豪並且年年都**了這項比賽。但隨著時間的推移,看著其他農夫的膽小奶牛們在相距很近的岩石之間緩慢前行,他感到非常厭煩。他計畫移走一些岩石,使得從起點到終點的過程中,最短的跳躍距離最長。他可以移走除起點和終點外的至多m (0 ≤ m ≤ n) 個岩石。

請幫助約翰確定移走這些岩石後,最長可能的最短跳躍距離是多少?

第一行包含三個整數l, n, m,相鄰兩個整數之間用單個空格隔開。

接下來n行,每行乙個整數,表示每個岩石與起點的距離。岩石按與起點距離從近到遠給出,且不會有兩個岩石出現在同乙個位置。

乙個整數,最長可能的最短跳躍距離。

25 5 2211

1417

21

4

在移除位於2和14的兩個岩石之後,最短跳躍距離為4(從17到21或從21到25)。

二分查詢

關鍵思路就是:(參考別人的思路)
用二分法去推求最長可能的最短跳躍距離。

最初,待求結果的可能範圍是[0,l]的全程區間,因此暫定取其半程(l/2)作為當前的最短跳躍距離,以這個標準進行岩石的篩選。

篩選過程是:

先以起點為基點,如果從基點到第1塊岩石的距離小於這個最短跳躍距離,則移除第1塊岩石,再看接下來那塊岩石(原序號是第2塊),如果還夠不上最小跳躍距離,就繼續移除。直至找到一塊距離基點超過最小跳躍距離的岩石,保留這塊岩石,並將它作為新的基點,再重複前面過程,逐一考察和移除在它之後的那些距離不足的岩石,直至找到下乙個基點予以保留。。。

當這個篩選過程最終結束時,那些倖存下來的基點,彼此之間的距離肯定是大於當前設定的最短跳躍距離的。

這個時候要看一下被移除岩石的總數,

如果總數》m,則說明被移除的岩石數量太多了(已超過上限值),進而說明當前設定的最小跳躍距離(即l/2)是過大的,其真實值應該是在[0, l/2]之間,故暫定這個區間的中值(l/4)作為接下來的最短跳躍距離,並以其為標準重新開始一次岩石篩選過程。。。

如果總數≤m,則說明被移除的岩石數量並未超過上限值,進而說明當前設定的最小跳躍距離(即l/2)很可能過小,準確值應該是在[l2, l]之間,故暫定這個區間的中值(34l)作為接下來的最短跳躍距離。。。

#include#include#define ll long long

#define maxn 50000+5

using namespace std;

ll l,n,m;

int a[maxn]=,b[maxn]={},g;

int search()

else g=a[i];//換基點

} if(t>m)//移除的點多了,mid太大了

else

}cout<>l>>n>>m;

for(int i=1;i<=n;i++)

a[n+1]=l;

search();

return 0;

}

河中跳房子

時間限制 1 sec 記憶體限制 128 mb 25 5 2211 1417 214 總時間限制 1000ms 記憶體限制 65536kb 描述每年奶牛們都要舉辦各種特殊版本的跳房子比賽,包括在河裡從乙個岩石跳到另乙個岩石。這項激動人心的活動在一條長長的筆直河道中進行,在起點和離起點l遠 1 l 1...

1247 河中跳房子

每年奶牛們都要舉辦各種特殊版本的跳房子比賽,包括在河裡從乙個岩石跳到另乙個岩石。這項激動人心的活動在一條長長的筆直河道中進行,在起點和離起點l遠 1 l 1,000,000,000 的終點處均有乙個岩石。在起點和終點之間,有n 0 n 50,000 個岩石,每個岩石與起點的距離分別為di 0 di ...

河中跳房子(二分)

每年奶牛們都要舉辦各種特殊版本的跳房子比賽,包括在河裡從乙個岩石跳到另乙個岩石。這項激動人心的活動在一條長長的筆直河道中進行,在起點和離起點l遠 1 l 1,000,000,000 的終點處均有乙個岩石。在起點和終點之間,有n 0 n 50,000 個岩石,每個岩石與起點的距離分別為di 0 di ...