石头移动问题(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

第二种:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值