poj3258 River Hopscotch (二分搜索,考虑最大值最小问题)
每年奶牛們都要舉辦各種特殊版本的跳房子比賽,包括在河里從一塊巖石跳到另一塊巖石。這項(xiàng)激動(dòng)人心的活動(dòng)在一條長(zhǎng)長(zhǎng)的筆直河道中進(jìn)行,在起點(diǎn)和距離起點(diǎn) L 遠(yuǎn)的終點(diǎn)各有一塊巖石 (1 ≤ L ≤ 10^9)。在起點(diǎn)和終點(diǎn)之間,有 N 塊巖石 (0 ≤ N ≤ 50000),每塊巖石與起點(diǎn)的距離分別為 Di (0 < Di < L)。
在比賽過(guò)程中,奶牛輪流從起點(diǎn)出發(fā),嘗試到達(dá)終點(diǎn),每一步只能從一塊巖石跳到另一塊巖石。當(dāng)然,實(shí)力不濟(jì)的奶牛無(wú)法抵達(dá)終點(diǎn),在河中間就退出比賽了。
農(nóng)夫約翰為他的奶牛們感到自豪并且年年都觀看了這項(xiàng)比賽。但隨著時(shí)間的推移,看著其他農(nóng)夫的膽小奶牛們?cè)谙嗑嗪芙膸r石之間緩慢前行,他感到非常厭煩。他計(jì)劃移走一些巖石,使得從起點(diǎn)到終點(diǎn)的過(guò)程中,最短的跳躍距離最長(zhǎng)。他可以移走除起點(diǎn)和終點(diǎn)外的至多 M 塊巖石 (0 ≤ M ≤ N)。
請(qǐng)幫助農(nóng)夫約翰確定:移走這些巖石后,最短跳躍距離的最大值是多少?
輸入
第 1 行包含以單個(gè)空格分隔的三個(gè)整數(shù) L, N, M。
第 2 到 N + 1 行,每行一個(gè)整數(shù),表示每個(gè)巖石與起點(diǎn)的距離。不會(huì)有兩個(gè)巖石出現(xiàn)在同一個(gè)位置。
輸出
輸出一個(gè)整數(shù),即最短跳躍距離的最大值。
示例輸入
25 5 2
2
14
11
21
17
示例輸出
4
提示
在移除位于 2 和 14 的兩塊巖石之后,最短跳躍距離達(dá)到了最大值 4 (從 17 到 21,或從 21 到 25)。
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int main() {int L,n,m;while(cin>>L>>n>>m){int a[50005];a[0]=0;for(int i=1;i<=n;++i)scanf("%d",&a[i]);a[n+1]=L;sort(a,a+n+2);int low=0,high=L,mid;while(low<=high){mid=low+(high-low)/2;/* int ans=0,tag=a[0];int sum=0;for(int i=1;i<=n+1;){if(mid>=(sum+=a[i]-a[i-1]))//在網(wǎng)上看的這個(gè)思想也挺好{i++;ans++;}else{i++;sum=0;} //tag=a[i];}*/int ans=0,tag=a[0];for(int i=1;i<=n+1;++i){if(mid>=a[i]-tag){//tag=a[i-1];自己寫的這個(gè)思想,開(kāi)始是個(gè)bug,原因是這行代碼不應(yīng)該加ans++;}elsetag=a[i];}//cout<<mid<<endl;if(ans<=m){//cout<<mid<<endl;low=mid+1;}elsehigh=mid-1;}cout<<low<<endl;}return 0; }
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
以上是生活随笔為你收集整理的poj3258 River Hopscotch (二分搜索,考虑最大值最小问题)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: poj2976Dropping test
- 下一篇: poj 3104 Drying