石頭移動問題(POJ河中跳房子)

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

第二種:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章