河中跳房子(noiopenjudge,noip2015)
描述
每年奶牛們都要舉辦各種特殊版本的跳房子比賽,包括在河里從一個巖石跳到另一個巖石。這項激動人心的活動在一條長長的筆直河道中進行,在起點和離起點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 2 2 11 14 17 21樣例輸出
4提示
在移除位于2和14的兩個巖石之后,最短跳躍距離為4(從17到21或從21到25)。
限制與約定
時間限制:1s
空間限制:128MB
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> using namespace std; const int maxn = 50000 + 10 ; int dis[maxn]; int main() { // freopen("stone.in","r",stdin); // freopen("stone.out","w",stdout);int L,n,m;cin>>L>>n>>m;for(int i=1;i<=n;i++)scanf("%d",&dis[i]);int l=1,r=L;sort(dis+1,dis+n+1);while(l<r){int i,mid = ( l + r + 1 ) >> 1,pos(0),temp(0);for(i=1;i<=n;i++){if(dis[i]+mid>L) break;if(dis[i]-pos<mid) temp++;else pos = dis[i];}temp+=n-i+1;if(temp<=m) l=mid;else r=mid-1;}cout<<l<<endl;return 0; }?
轉載于:https://www.cnblogs.com/hfang/p/11239892.html
總結
以上是生活随笔為你收集整理的河中跳房子(noiopenjudge,noip2015)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二分 奇怪的函数
- 下一篇: 队列 集合的前n个元素