時間限制: 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 22111417
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 ...