POJ - 3258 River Hopscotch 【二分--最大化最小值】
阿新 • • 發佈:2018-11-19
題目描述:第一行輸入三個整數L,N,K,表示一個長度為L的河上有N塊石頭,任意移去K塊,問任意兩塊石頭之間的最小間隔是多少(包括起始點到第一塊石頭的間隔和最後一塊石頭到終點的間隔),接下來N行是N塊石頭距離起始點的位置。
解題思路:這是一道典型的利用二分最大化最小值的題。現在要做的是怎樣去確定二分的那個值可以成為最小值。
AC程式碼:
//二分最大化最小值 #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <queue> #include <stack> #include <vector> #include <map> #include <set> using namespace std; #define io ios::sync_with_stdio(0),cin.tie(0) #define ms(arr) memset(arr,0,sizeof(arr)) #define inf 0x3f3f3f typedef long long ll; const int mod=1e9+7; const int maxn=5e4+7; int l,n,m; int a[maxn]; bool judge(int x)//判斷最小值是否能不小於x { int cnt=0; int j=0; for(int i=1;i<=n+1;i++) { if(a[i]-a[j]>=x) j=i; else cnt++; } if(cnt<=m) return true; return false; } int main() { io; cin>>l>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+n+1); a[0]=0; a[n+1]=l; int left=0; int right=l+1; while(left+1<right) { int mid=(left+right)>>1; if(judge(mid)) left=mid; else right=mid; } cout<<left<<endl; return 0; }