poj上問題鏈接 河中跳房子
給出 L, N,M,L表示兩岸最左邊和最右邊的石頭的距離,最左邊和最右邊的石頭不能移動,中間有N塊石頭都可以移走,要求移出M塊石頭,要求給出移出M塊石頭所能得到的移出後相鄰兩塊石頭間最短距離的最大值(因爲移出不同的M塊石頭,所有相鄰兩塊石頭間的最小值可以不相同)。
其次給出N行,分別表示距離最左邊石頭的距離:最左邊和最右邊的石頭距離最左邊的石頭的距離分別爲a[0] = 0, a[N + 1] = L ,如果給出的是相鄰兩塊石頭距離,要先轉換成距離最左邊石頭的方法再求解。
二分法(注意<bits/stdc++.h>包含了c以及c++的所有頭文件,只需再加上using namespace std即可),枚舉的mid實際上是猜測可能的最短距離,要求出最大的最短距離,所以用二分法多次求滿足條件的,直到取得最大:
#include<bits/stdc++.h>
using namespace std;
int a[100000];
int main()
{
int L,N,M,low=0,high,i,j;
cin >> L >> N >> M;
for(i=1;i<=N;i++)
cin >> a[i];
a[N + 1] = L;
high = L + 1;
while(low + 1 < high)
{
int mid = ( low + high) / 2,k=0;
i=0;
while(i <= N)
{
j = i + 1;
while(a[j] - a[i] < mid && j < N + 2)
j++;
k += j - i - 1;
i = j;
}
if(k > M)
high = mid;//k > M說明移出的石頭較多,mid取值較大,多移出石頭才能得到較大的距離
else
low = mid;//k < M說明移出的石頭較少,mid取值較小,不需要移出太多的石頭,= M也可以進一步的簡化
}
cout << low;
}
這題還是很難的,poj上也有這題,注意poj上提示TLE或者RE可能是因爲數組太小的緣故。
幾個輸出:
下面從2個石頭中取出1個可以得到最短距離的最大值是3
第二種: