NOI OJ 1 11 10 河中跳房子

2021-10-01 22:01:31 字數 2200 閱讀 5628

該題應採用二分法選取距離,否則可能會有超時的問題

每年奶牛們都要舉辦各種特殊版本的跳房子比賽,包括在河裡從乙個岩石跳到另乙個岩石。這項激動人心的活動在一條長長的筆直河道中進行,在起點和離起點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用兩分法去推求最長可能的最短跳躍距離

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

篩選過程是:

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

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

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

#include

#include

#include

#include

#include

using

namespace std;

intassign

(int mid,

int d,

int n)

++mn;

}return n+

2-mn;

//起點和終點處的石頭未加入計數n

}int d[

50000];

intmain()

d[i]

= l;

int max = l, min =0;

int mid =

(max + min)/2

;int mn =

assign

(mid, d, n)

;while

(max >= min)

//不可 while (mn!=m) 第二組測試陣列會出現問題??可能是移走同樣數量的石頭,但移走的位置不同,會使最小距離也不同吧,這個理由對於下乙個問題可能同樣適用

cout << mid;

return0;

}

我的**用時大約是參考**的2倍,應該是因為移取岩石步驟太繁瑣,也可能是因為布林的返回值會用時更少??

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

int base;

int top,mid;

int l,n,m;

int nodes[

50010];

bool

find

(int dis)}if

(num>n-m)

return

false;}

intmain()

nodes[n+1]

=l; base=1;

top=l;

int ans=0;

while

(base<=top)

else

} cout<}

河中跳房子

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

河中跳房子

時間限制 1000 ms 記憶體限制 65536 kb 提交數 485 通過數 227 每年奶牛們都要舉辦各種特殊版本的跳房子比賽,包括在河裡從乙個岩石跳到另乙個岩石。這項激動人心的活動在一條長長的筆直河道中進行,在起點和離起點l遠 1 l 1,000,000,000 的終點處均有乙個岩石。在起點和...

1247 河中跳房子

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