2015 提高组 跳石头--二分答案
題目背景
一年一度的“跳石頭”比賽又要開始了!
題目描述
這項比賽將在一條筆直的河道中進行,河道中分布著一些巨大巖石。組委會已經選擇好了兩塊巖石作為比賽起點和終點。在起點和終點之間,有?N?塊巖石(不含起點和終點的巖石)。在比賽過程中,選手們將從起點出發,每一步跳向相鄰的巖石,直至到達終點。
為了提高比賽難度,組委會計劃移走一些巖石,使得選手們在比賽過程中的最短跳躍距離盡可能長。由于預算限制,組委會至多從起點和終點之間移走?M?塊巖石(不能移走起點和終點的巖石)。
輸入輸出格式
輸入格式:
?
第一行包含三個整數?L,N,M?,分別表示起點到終點的距離,起點和終點之間的巖石數,以及組委會至多移走的巖石數。保證?L≥1?且?N≥M≥0?。
接下來?N?行,每行一個整數,第?i?行的整數?Di?(0<Di?<L)?, 表示第?i?塊巖石與起點的距離。這些巖石按與起點距離從小到大的順序給出,且不會有兩個巖石出現在同一個位置。
?
輸出格式:
?
一個整數,即最短跳躍距離的最大值。
?
輸入輸出樣例
輸入樣例#1:?25 5 2 2 11 14 17 21 輸出樣例#1:?
4
說明
輸入輸出樣例 1 說明:將與起點距離為?2?和?14?的兩個巖石移走后,最短的跳躍距離為?4?(從與起點距離?17?的巖石跳到距離?21?的巖石,或者從距離?21?的巖石跳到終點)。
另:對于?20%?的數據,?0≤M≤N≤10?。
對于?50%?的數據,?0≤M≤N≤100?。
對于?100%?的數據,?0≤M≤N≤50,000,1≤L≤1,000,000,000?。
?
二分答案,二分每次跳躍的最短距離,沒啥好說的。
#include<algorithm> #include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; const int mxn=100500; long long Le,n,m; long long dis[mxn]; int mid; long long ans=0; int judge() {int cnt=0;int lasum=0;for(int i=1; i<=n; i++){lasum+=dis[i]-dis[i-1];if(lasum<mid){cnt++;}else lasum=0; }if(cnt>m)return 0;return 1; } int main() {scanf("%lld%lld%lld",&Le,&n,&m);int i,j;for(i=1; i<=n; i++)scanf("%lld",&dis[i]);dis[n+1]=Le;sort(dis+1,dis+n+2);n+=1;int l=0,r=Le;while(l<=r){mid=(l+r)>>1;if(judge()){l=mid+1;ans=mid;}else r=mid-1;}printf("%lld\n",ans);return 0; }?
轉載于:https://www.cnblogs.com/rmy020718/p/9322449.html
總結
以上是生活随笔為你收集整理的2015 提高组 跳石头--二分答案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习入门KNN近邻算法(一)
- 下一篇: 糟糕的一天【栈】